run method fake convert await async c# multithreading asynchronous

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).