Подтвердить что ты не робот

В чем разница между .Wait() vs .GetAwaiter(). GetResult()?

Мой метод возвращает Task. Я хочу подождать, пока он не закончится. Что я должен использовать .Wait() или .GetAwaiter().GetResult()? В чем разница между ними?

4b9b3361

Ответ 1

Оба являются синхронным ожиданием результата операции (и вам следует избегать, если это возможно).

Разница заключается главным образом в обработке исключений. С Wait трассировка стека исключений не изменяется и представляет фактический стек во время исключения, поэтому, если у вас есть кусок кода, который работает в потоке потока, у вас есть стек, например

ThreadPoolThread.RunTask
YourCode.SomeWork

С другой стороны, .GetAwaiter().GetResult() будет перерабатывать трассировку стека, чтобы учитывать весь асинхронный контекст, игнорируя, что некоторые части кода выполняются в потоке пользовательского интерфейса, а некоторые - в потоке ThreadPool, а некоторые просто асинхронны I/O. Таким образом, ваша трассировка стека будет отображать синхронный шаг через ваш код:

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

Это, как правило, делает следы стека исключений намного более полезными, если не сказать больше. Вы можете увидеть, где YourCode.SomeWork был вызван в контексте вашего приложения, а не "физическим способом его запуска".

Пример того, как это работает, находится в справочном источнике (конечно, без контракта).