Ambas as respostas não mencionaram o esperado Task.WhenAll
:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
A principal diferença entre Task.WaitAll
e Task.WhenAll
é que o primeiro será bloqueado (semelhante ao uso Wait
em uma única tarefa), enquanto o último não será e poderá ser aguardado, retornando o controle ao chamador até que todas as tarefas sejam concluídas.
Além disso, o tratamento de exceções é diferente:
Task.WaitAll
:
Pelo menos uma das instâncias da tarefa foi cancelada - ou - uma exceção foi lançada durante a execução de pelo menos uma das instâncias da tarefa. Se uma tarefa foi cancelada, o AggregateException contém um OperationCanceledException em sua coleção InnerExceptions.
Task.WhenAll
:
Se alguma das tarefas fornecidas for concluída em um estado com falha, a tarefa retornada também será concluída em um estado com falha, em que suas exceções conterão a agregação do conjunto de exceções não desempacotadas de cada uma das tarefas fornecidas.
Se nenhuma das tarefas fornecidas falhar, mas pelo menos uma delas foi cancelada, a tarefa retornada terminará no estado Cancelado.
Se nenhuma das tarefas falhar e nenhuma delas foi cancelada, a tarefa resultante terminará no estado RanToCompletion. Se a matriz / enumerável fornecida não contiver tarefas, a tarefa retornada passará imediatamente para um estado RanToCompletion antes de retornar ao chamador.
await Task.WhenAll(task1, task2);
?