Вы правы, если вы находитесь в приложении с графическим интерфейсом, продолжающиеся части метода async
будут выполняться в потоке пользовательского интерфейса по умолчанию.И если вы одновременно выполняете синхронное ожидание одной и той же Задачи в потоке пользовательского интерфейса, вы получите тупик.
Если это ваше приложение, вы можете решить эту проблему, просто не ожидая задачи синхронно.
Если вы просто пишете библиотеку, это можно исправить с помощью ConfigureAwait(false)
.Таким образом, часть продолжения метода будет выполняться не в захваченном контексте (поток пользовательского интерфейса в приложениях с графическим интерфейсом), а вместо этого в потоке ThreadPool.
public static async Task<ReturnResultClass> GetBasicResponseAsync()
{
var r = await SomeClass.StartAsyncOp().ConfigureAwait(false);
return await OtherClass.ProcessAsync(r).ConfigureAwait(false);
}
Конечно, идеальным решением является неиспользуйте синхронные операции в приложениях с графическим интерфейсом и , используйте ConfigureAwait()
в своей библиотеке, чтобы другие могли использовать синхронные версии методов, если захотят.