understanding - task whenall c#
Espera un método asíncrono vacío (5)
La mejor práctica es marcar la función async void
solo si es método de disparo y olvidar, si desea esperar, debe marcarlo como async Task
.
En caso de que aún quieras esperar, envuélvela como await Task.Run(() => blah())
¿Cómo puedo esperar a que un método void async
termine su trabajo?
por ejemplo, tengo una función como la siguiente:
async void LoadBlahBlah()
{
await blah();
...
}
ahora quiero asegurarme de que todo se haya cargado antes de continuar en otro lugar.
La mejor solución es usar la async Task
. Debe evitar el async void
por varias razones, una de las cuales es la capacidad de compilación.
Si no se puede hacer que el método devuelva Task
(por ej., Es un manejador de eventos), entonces puede usar SemaphoreSlim
para hacer que la señal del método esté a punto de salir. Considera hacer esto en un bloque final.
No necesita hacer nada manualmente, await
palabra clave pausa la ejecución de la función hasta que blah()
regrese.
private async void SomeFunction()
{
var x = await LoadBlahBlah(); <- Function is paused
//do more stuff when LoadBlahBlah() returns
}
private async Task<T> LoadBlahBlah()
{
return await blah(); <- function is paused
}
T
es el tipo de objeto blah()
devuelve
Realmente no puedes await
una función void
para que LoadBlahBlah()
no pueda ser void
Si puede cambiar la firma de su función para realizar una async Task
, puede usar el código que se presenta here
haga un AutoResetEvent, llame a la función, luego espere en AutoResetEvent y luego configúrelo como async void cuando sepa que ya está hecho.
También puede esperar en una Tarea que regresa de su nulo asincrónico