/ / Вземи резултат от метода за синхронизация - c #, async-await, c # -5.0

Получете резултат от метода за синхронизация - c #, async-await, c # -5.0

Имам метод, който прави асинхронно обаждане до уеб услуга. Нещо такова:

public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp();
return await OtherClass.ProcessAsync(r);
}

И искам да осигуря синхронна алтернатива:

public static ReturnResultClass GetBasicResponse()
{
return GetBasicResponseAsync().Result;
}

Но блокира Result обадете се. Тъй като се нарича на същата нишка като операции за синхронизация. Как мога да получа синхронен резултат?

Благодаря!

Отговори:

8 за отговор № 1

Вие сте права, ако сте в GUI приложение, продължената част (и) на async методът ще се изпълни по подразбиране на нишката на потребителския интерфейс. И ако изпълнявате синхронно чакане за една и съща задача на темата за потребителския интерфейс по едно и също време, ще получите застой.

Ако това е вашето приложение, можете да решите това, като просто не чакате задачата синхронно.

Ако просто пишете библиотека, можете да го коригирате, като използвате ConfigureAwait(false), По този начин продължената част на метода няма да се изпълни в записания контекст (нишката на потребителския интерфейс в GUI приложенията), а в нишка ThreadPool.

public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp().ConfigureAwait(false);
return await OtherClass.ProcessAsync(r).ConfigureAwait(false);
}

Разбира се, идеалното решение е да не използвате синхронизирани операции във вашите GUI приложения и употреба ConfigureAwait() във вашата библиотека, така че другите да могат да използват синхронни версии на методите, ако искат.