Meu método retorna Task
. Eu quero esperar até que termine. O que devo usar
.Wait()
ou .GetAwaiter().GetResult()
? Qual a diferença entre eles?
Meu método retorna Task
. Eu quero esperar até que termine. O que devo usar
.Wait()
ou .GetAwaiter().GetResult()
? Qual a diferença entre eles?
Ambos são uma espera síncrona pelo resultado da operação (e você deve evitá-los, se possível).
A diferença está principalmente no tratamento de exceções. Com Wait
, o rastreamento de pilha de exceção é inalterado e representa a pilha real no momento da exceção, então se você tem um pedaço de código que roda em um thread pool de threads, você tem uma pilha como
ThreadPoolThread.RunTask
YourCode.SomeWork
Por outro lado, .GetAwaiter().GetResult()
retrabalhará o rastreamento de pilha para levar em consideração todo o contexto assíncrono, ignorando que algumas partes do código são executadas no encadeamento de IU e outras em um encadeamento ThreadPool e algumas são simplesmente E / S assíncronas. Portanto, seu rastreamento de pilha refletirá uma etapa semelhante à síncrona em seu código :
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
Isso tende a tornar os rastreamentos de pilha de exceção muito mais úteis, para dizer o mínimo. Você pode ver onde YourCode.SomeWork
foi chamado no contexto de seu aplicativo , em vez de "a forma física como foi executado".
Um exemplo de como isso funciona está na fonte de referência (não contratual, é claro).
TaskAwaiter
é um detalhe de implementação. Por outro lado, o mecanismo de espera / espera é documentado e usa digitação de pato -GetAwaiter
é paraawait
comoGetEnumerator
éforeach
ouDispose
é parausing
. Tudo isso é definido na especificação C # independentemente do waititer em particular que está sendo usado - observe queTask.GetAwaiter
"se destina ao uso do compilador em vez de ser usado no código do aplicativo" Mas o ponto é que o uso pretendido é fazer umawait
, nãoWait()
nemGetAwaiter().GetResult()
- masGetResult
fornecer pilhas melhores se você precisar.