c# .net async-await

c# - Async await vs GetAwaiter(). GetResult() y devolución de llamada



.net async-await (1)

Debe usar async y await palabras clave hasta el final, o no debe usar async en absoluto.

Tu segunda opción no es realmente asíncrona. Es llamar a una operación asíncrona y bloquearla de forma síncrona con task.GetAwaiter().GetResult() . Además de ser muy complicado, no es asíncrono y puede provocar interbloqueos.

Estoy tratando de encontrar la mejor práctica para uno de mis proyectos. Es una aplicación típica de WPF con una interfaz de usuario que muestra una lista de elementos y hay un servicio de datos que devuelve el resultado.

Estamos llamando al servicio de forma asíncrona para no bloquear la interfaz de usuario. Tenemos 2 opciones frente a nosotros:

  1. Usar Async espere palabras clave Esto requiere marcar todos los métodos Async from button click to the service layer (clase en el lado del cliente que realiza la llamada http al servidor) y cualquier método intermedio. Este enfoque funciona bien, aparte del problema de propagar asíncronos en todas partes.

  2. Use awaiter y callback En este enfoque, el cliente de UI llama a la capa de servicio y pasa una devolución de llamada a la capa de servicio, la capa de servicio envuelve la llamada http al servidor en una tarea y usa GetAwaiter (). GetResult (), cuando la llamada http está terminado, invoca la devolución de llamada pasada por el cliente UI. En este caso, ningún método debe estar marcado como asíncrono, pero no está realmente seguro del uso de GetAwaiter ()

    Task.Run (async () => // espera llamada http, invoca devolución de llamada) .GetAwaiter (). GetResult ();

Solo estoy tratando de descubrir cuál es el mejor enfoque y si hay algunos problemas con cualquiera de los dos enfoques que debería conocer.