Код, который вы опубликовали, работает, потому что Task.WhenAll
возвращает задачу, которая завершается только после завершения всех подзадач.
Почему код делает это таким образом?Почему нет catch (Exception ex)
?Это потому, что ожидают только бросает первое внутреннее исключение.Если вам нужен доступ к нескольким исключениям, этот шаблон кода является хорошим способом сделать это.Вы также можете сделать catch (AggregateException ex)
и использовать этот объект.Это тот же объект.
Лично я избегаю использовать catch
как этот.По сути, он использует исключения для потока управления.Это усложняет отладку и может привести к подробному коду.
Мне нравится это:
var whenAllTask = Task.WhenAll(...);
await whenAllTask.ContinueWith(_ => { }); //never throws
if (whenAllTask.Exception != null) ... //handle exceptions
Я сделал бит .ContinueWith(_ => { })
в методе расширения WhenCompleted
, чтобы код выглядел чистым.
Тогда вы задались вопросом, является ли второй способ проверки исключений хорошей идеей:
// Or necessary to check for and handle aggregate exceptions here?
if (masterTask.Exception != null) {
foreach (var ex in masterTask.Exception.innerExceptions) {
HandleException(ex);
}
}
Вы, безусловно, можете это сделать.По сути это одно и то же.Используйте то, что удобнее в конкретной ситуации.