Мой метод возвращает Task
. Я хочу подождать, пока он не закончится. Что я должен использовать
.Wait()
или .GetAwaiter().GetResult()
? В чем разница между ними?
В чем разница между .Wait() vs .GetAwaiter(). GetResult()?
Ответ 1
Оба являются синхронным ожиданием результата операции (и вам следует избегать, если это возможно).
Разница заключается главным образом в обработке исключений. С Wait
трассировка стека исключений не изменяется и представляет фактический стек во время исключения, поэтому, если у вас есть кусок кода, который работает в потоке потока, у вас есть стек, например
ThreadPoolThread.RunTask
YourCode.SomeWork
С другой стороны, .GetAwaiter().GetResult()
будет перерабатывать трассировку стека, чтобы учитывать весь асинхронный контекст, игнорируя, что некоторые части кода выполняются в потоке пользовательского интерфейса, а некоторые - в потоке ThreadPool, а некоторые просто асинхронны I/O. Таким образом, ваша трассировка стека будет отображать синхронный шаг через ваш код:
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
Это, как правило, делает следы стека исключений намного более полезными, если не сказать больше. Вы можете увидеть, где YourCode.SomeWork
был вызван в контексте вашего приложения, а не "физическим способом его запуска".
Пример того, как это работает, находится в справочном источнике (конечно, без контракта).