为了得到所有失败任务的异常信息,可以将 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}");}}
}