为了得到所有失败任务的异常信息,可以将 Task.WhenAll 返回的结果写到一个Task 变量中。这个任务会一直等到所有任务都结束。否则,仍然可能错过抛出的异常。上一小节中,catch 语句只检索到第一个任务的异常。不过,现在可以访问外部任务的Exception 属性了。Exception 属性是AggregateException类型的。这个是常类型定义了InnerExceptions 属性(不只是InnerException),它包含了等待中的所有异常的列表。现在,可以轻松遍历所有异常了。.
private static async void ShowAggregatedException()
{
Task taskResult = null;
try
{
Task tl = ThrowAfter(2000, "first");
Task t2 = ThrowAfter(1000, "second");
await (taskResult = Task.WhenAll(t1, t2));
}
catch (Exception ex)
{
Console.WriteLine($"handled {ex.Message}");
foreach (var ex1 in taskResult.Exception.InnerExceptions)
{
Console.WriteLine($"inner exception {ex1.Message}");
}
}
}