c# - method - ¿Cuál es la diferencia entre.Wait() vs.GetAwaiter(). GetResult()?
fake async c# (1)
Mi método devuelve
Task
.
Quiero esperar hasta que termine.
¿Qué debo usar
.Wait()
o
.GetAwaiter().GetResult()
?
¿Cuál es la diferencia entre ellos?
Ambos son una espera sincrónica para el resultado de la operación (y debe evitarlos si es posible).
La diferencia está principalmente en el manejo de excepciones.
Con
Wait
, el seguimiento de la pila de excepción no se altera y representa la pila real en el momento de la excepción, por lo que si tiene un fragmento de código que se ejecuta en un subproceso de grupo de subprocesos, tendría una pila como
ThreadPoolThread.RunTask
YourCode.SomeWork
Por otro lado,
.GetAwaiter().GetResult()
volverá a trabajar el seguimiento de la pila para tener en cuenta todo el contexto asincrónico, ignorando que algunas partes del código se ejecutan en el hilo de la interfaz de usuario, y algunas en un hilo ThreadPool, y algunas son simplemente E / S asíncrona.
Por lo tanto, su seguimiento de pila reflejará un paso sincrónico a través de
su código
:
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
Esto tiende a hacer que los rastros de pila de excepciones sean mucho más útiles, por decir lo menos.
Puede ver dónde se llamó a
YourCode.SomeWork
en el contexto de su aplicación
, en lugar de "la forma física en que se ejecutó".
Un ejemplo de cómo funciona esto está en la fuente de referencia (no contractual, por supuesto).