Получить результат асинхронного метода - PullRequest
5 голосов
/ 03 марта 2012

У меня есть метод, который делает асинхронный вызов веб-службы.Примерно так:

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

И я хочу предоставить синхронную альтернативу:

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

Но это блокирует при Result вызове.Потому что он вызывается в том же потоке, что и асинхронные операции.Как получить результат синхронно?

Спасибо!

1 Ответ

10 голосов
/ 03 марта 2012

Вы правы, если вы находитесь в приложении с графическим интерфейсом, продолжающиеся части метода 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() в своей библиотеке, чтобы другие могли использовать синхронные версии методов, если захотят.

...