Task.GetAwaiter().GetResult()
se prefiere sobre Task.Wait
y Task.Result
porque propaga excepciones en lugar de envolverlas en un AggregateException
. Sin embargo, los tres métodos causan la posibilidad de problemas de inmovilización y de grupo de subprocesos. Todos deben ser evitados a favor de async/await
.
La cita a continuación explica por qué Task.Wait
y Task.Result
no simplemente contiene el comportamiento de propagación de excepción de Task.GetAwaiter().GetResult()
(debido a una "barra de compatibilidad muy alta").
Como mencioné anteriormente, tenemos una barra de compatibilidad muy alta y, por lo tanto, hemos evitado los cambios importantes. Como tal, Task.Wait
conserva su comportamiento original de siempre envolver. Sin embargo, es posible que se encuentre en algunas situaciones avanzadas en las que desee un comportamiento similar al bloqueo sincrónico empleado Task.Wait
, pero donde desee que la excepción original se propague sin envolver en lugar de encerrarse en un AggregateException
. Para lograr eso, puede apuntar directamente al camarero de la Tarea. Cuando escribe " await task;
", el compilador lo traduce al uso del Task.GetAwaiter()
método, que devuelve una instancia que tiene un GetResult()
método. Cuando se usa en una Tarea defectuosa, GetResult()
propagará la excepción original (así es como " await task;
" obtiene su comportamiento). Por lo tanto, puede usar "task.GetAwaiter().GetResult()
"Si desea invocar directamente esta lógica de propagación.
https://blogs.msdn.microsoft.com/pfxteam/2011/09/28/task-exception-handling-in-net-4-5/
" GetResult
" En realidad significa "verificar la tarea en busca de errores"
En general, hago todo lo posible para evitar el bloqueo sincrónico en una tarea asincrónica. Sin embargo, hay un puñado de situaciones en las que sí viole esa directriz. En esas raras condiciones, mi método preferido es GetAwaiter().GetResult()
porque conserva las excepciones de la tarea en lugar de envolverlas en un AggregateException
.
http://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html
GetResult
: "Este tipo y sus miembros están destinados a ser utilizados por el compilador". Otra persona no debería estar usándolo.