Обидві відповіді не згадували очікуваного Task.WhenAll
:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
Основна відмінність між Task.WaitAll
і Task.WhenAll
полягає в тому, що перший заблокує (подібно до використання Wait
в одному завданні), тоді як останнього не буде і на нього можна очікувати, повертаючи управління абоненту, поки всі завдання не закінчаться.
Тим більше, що обробка виключень відрізняється:
Task.WaitAll
:
Принаймні один із екземплярів Завдання було скасовано - або виняток було викинуто під час виконання принаймні одного з екземплярів Завдання. Якщо завдання було скасовано, AggregateException містить в своїй колекції InnerExceptions OperationCanceledException.
Task.WhenAll
:
Якщо будь-яке із заданих завдань завершиться у несправному стані, повернене завдання також буде виконане у стані Faulted, де його винятки містять агрегацію набору нерозгорнутих винятків з кожної із заданих задач.
Якщо жодне із поданих завдань не вийшло, але принаймні одне з них було скасовано, повернене завдання закінчиться у відміненому стані.
Якщо жодне із завдань не вийшло з ладу і жодне із завдань не було скасовано, отримане завдання закінчиться у стані RanToCompletion. Якщо наданий масив / перечислювальний ряд не містить завдань, повернене завдання негайно перейде до стану RanToCompletion, перш ніж воно повернеться до абонента.
await Task.WhenAll(task1, task2);
?