在此代码中:
private async void button1_Click(object sender, EventArgs e) {
try {
await Task.WhenAll(DoLongThingAsyncEx1(), DoLongThingAsyncEx2());
}
catch (Exception ex) {
// Expect AggregateException, but got InvalidTimeZoneException
}
}
Task DoLongThingAsyncEx1() {
return Task.Run(() => { throw new InvalidTimeZoneException(); });
}
Task DoLongThingAsyncEx2() {
return Task.Run(() => { throw new InvalidOperation();});
}
我期望
WhenAll
创建并抛出一个AggregateException
,因为它正在等待的至少一项任务引发了异常。相反,我找回了其中一个任务引发的单个异常。WhenAll
是否不总是创建AggregateException
吗? 最佳答案
我不完全记得该在哪里,但是我在某处读到了新的async / await关键字,它们将AggregateException
解包为实际的异常。
因此,在catch块中,您将得到实际的异常,而不是汇总的异常。这有助于我们编写更自然,更直观的代码。
为了将现有代码更轻松地转换为使用异步/等待,很多代码需要特定的异常而不是聚集的异常,这也是需要的。
-编辑-
得到它了:
An Async Primer by Bill Wagner
关于.net - 为什么不等待Task.WhenAll引发AggregateException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12007781/