В чем разница между Task.WaitAll()
и Task.WhenAll()
из Async CTP? Можете ли вы предоставить пример кода для иллюстрации различных вариантов использования?
c#
asynchronous
async-await
task-parallel-library
Ярон Леви
источник
источник
WhenAll
, но это не то же самое, что блокирование потока.Хотя ответ JonSkeet объясняет разницу, как правило, превосходно, есть еще одно отличие: обработка исключений .
Task.WaitAll
Бросает,AggregateException
когда выбрасывает любое из заданий, и вы можете проверить все сгенерированные исключения. Операторawait
inawait Task.WhenAll
разворачиваетAggregateException
и возвращает только первое исключение.Когда программа, представленная ниже, выполняется с
await Task.WhenAll(taskArray)
выводом следующим образом.Когда нижеприведенная программа выполняется с
Task.WaitAll(taskArray)
выходом следующим образом.Программа:
источник
await t1; await t2; await t3;
противawait Task.WhenAll(t1,t2,t3);
await
, а не разница между этими двумя методами. Оба распространяютAggregateException
, либо выбрасывая напрямую, либо через свойство (Task.Exception
свойство).В качестве примера различия - если у вас есть задача, она делает что-то с потоком пользовательского интерфейса (например, задача, которая представляет анимацию в раскадровке), если вы
Task.WaitAll()
тогда поток пользовательского интерфейса блокируется, и пользовательский интерфейс никогда не обновляется. если вы используете,await Task.WhenAll()
тогда поток пользовательского интерфейса не блокируется, и пользовательский интерфейс будет обновлен.источник
Что они делают:
Какая разница:
Используйте, когда:
источник
WaitAll
как я понимаю.Task.WaitAll
после того, как вы сделали свою другую работу? Я имею в виду, вместо того, чтобы называть это сразу после запуска ваших задач.