В обоих ответах не упоминалось ожидаемое Task.WhenAll
:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
Основное различие между Task.WaitAll
и Task.WhenAll
заключается в том, что первый будет блокировать (аналогично использованиюWait
в одной задаче), а последний не будет и его можно ожидать, передавая управление вызывающей стороне до завершения всех задач.
Более того, обработка исключений отличается:
Task.WaitAll
:
По крайней мере, один из экземпляров Задачи был отменен или возникла исключительная ситуация при выполнении хотя бы одного из экземпляров Задачи. Если задача была отменена, AggregateException содержит OperationCanceledException в своей коллекции InnerExceptions.
Task.WhenAll
:
Если любая из предоставленных задач завершается в состоянии Failed, возвращаемая задача также завершается в состоянии Failed, где ее исключения будут содержать агрегацию набора развернутых исключений для каждой из предоставленных задач.
Если ни одна из поставленных задач не была выполнена, но хотя бы одна из них была отменена, возвращенная задача завершится в состоянии Отменено.
Если ни одна из задач не была выполнена, и ни одна из задач не была отменена, результирующая задача завершится в состоянии RanToCompletion. Если предоставленный массив / enumerable не содержит задач, возвращаемая задача немедленно перейдет в состояние RanToCompletion, прежде чем она будет возвращена вызывающей стороне.
await Task.WhenAll(task1, task2);
?