Имам метод, който прави асинхронно обаждане до уеб услуга. Нещо такова:
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()
във вашата библиотека, така че другите да могат да използват синхронни версии на методите, ако искат.