Ambas respuestas no mencionaron lo esperado Task.WhenAll
:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
La principal diferencia entre Task.WaitAll
y Task.WhenAll
es que el primero se bloqueará (similar al uso Wait
en una sola tarea), mientras que el segundo no se podrá esperar, lo que devolverá el control a la persona que llama hasta que finalicen todas las tareas.
Más aún, el manejo de excepciones difiere:
Task.WaitAll
:
Al menos una de las instancias de la Tarea se canceló, o se lanzó una excepción durante la ejecución de al menos una de las instancias de la Tarea. Si se canceló una tarea, AggregateException contiene una OperationCanceledException en su colección InnerExceptions.
Task.WhenAll
:
Si alguna de las tareas suministradas se completa en un estado con error, la tarea devuelta también se completará en un estado con error, donde sus excepciones contendrán la agregación del conjunto de excepciones sin envolver de cada una de las tareas suministradas.
Si ninguna de las tareas suministradas falló pero al menos una de ellas se canceló, la tarea devuelta finalizará en el estado Cancelado.
Si ninguna de las tareas falló y ninguna de las tareas se canceló, la tarea resultante finalizará en el estado RanToCompletion. Si la matriz / enumerable suministrada no contiene tareas, la tarea devuelta pasará inmediatamente a un estado RanToCompletion antes de que se devuelva al llamante.
await Task.WhenAll(task1, task2);
?