Ответ 1
Task.WhenAll
возвращает задачу и, как и все задачи, свойство Exception
содержит AggregateException
, который объединяет все исключения.
Когда вы await
выполняете такую задачу, на самом деле будет выбрано только первое исключение.
... Из-за проблем с дочерними задачами или из-за таких комбинаторов, как Task.WhenAlll, одна задача может представлять собой несколько операций, и более чем одна из них может быть неисправна. В таком случае и с целью не потерять информацию об исключении (что может быть важно для отсрочки отсрочки), мы хотим иметь возможность представлять несколько исключений, и, таким образом, для типа оболочки мы выбрали AggregateException.
... Учитывая это и снова имея выбор всегда бросать первый или всегда бросать агрегат, для "ожидания" мы предпочитаем всегда бросать первый
из Обработка исключений задач в .NET 4.5
Вам решать, нужно ли сначала обрабатывать только await task;
(true в большинстве случаев) или обрабатывать все, используя task.Exception
(как в моем примере ниже), но в обоих случаях a
и b
не поднимет UnobservedTaskException
.
var task = Task.WhenAll(a, b);
try
{
await task;
}
catch
{
Trace.WriteLine(string.Join(", ", task.Exception.Flatten().InnerExceptions.Select(e => e.Message)));
}