Task.GetAwaiter().GetResult()
é preferido Task.Wait
e Task.Result
porque propaga exceções em vez de agrupá-las em um arquivo AggregateException
. No entanto, todos os três métodos causam o potencial de problemas de falta de deadlock e pool de encadeamentos. Todos eles devem ser evitados em favor de async/await
.
A citação abaixo explica por que Task.Wait
e Task.Result
não contém simplesmente o comportamento de propagação de exceção de Task.GetAwaiter().GetResult()
(devido a uma "barra de compatibilidade muito alta").
Como mencionei anteriormente, temos uma barra de compatibilidade muito alta e, portanto, evitamos interromper as alterações. Como tal, Task.Wait
mantém seu comportamento original de sempre quebrar. No entanto, você pode se encontrar em algumas situações avançadas em que deseja um comportamento semelhante ao bloqueio síncrono empregado por Task.Wait
, mas em que deseja que a exceção original seja propagada sem quebra, em vez de envolvida em um AggregateException
. Para conseguir isso, você pode direcionar o garçom da tarefa diretamente. Quando você escreve “ await task;
”, o compilador converte isso no uso do Task.GetAwaiter()
método, que retorna uma instância que possui um GetResult()
método. Quando usado em uma tarefa com falha, GetResult()
propagará a exceção original (é assim que " await task;
" obtém seu comportamento). Você pode usar "task.GetAwaiter().GetResult()
”Se você desejar chamar diretamente essa lógica de propagação.
https://blogs.msdn.microsoft.com/pfxteam/2011/09/28/task-exception-handling-in-net-4-5/
" GetResult
" Significa realmente "verifique a tarefa quanto a erros"
Em geral, tento o meu melhor para evitar o bloqueio síncrono de uma tarefa assíncrona. No entanto, existem algumas situações em que eu viole essa diretriz. Nessas condições raras, meu método preferido é GetAwaiter().GetResult()
porque preserva as exceções da tarefa em vez de agrupá-las em um AggregateException
.
http://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html
GetResult
: "Este tipo e seus membros devem ser usados pelo compilador." Outra pessoa não deveria estar usando.