在此代码中:

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/

10-09 18:41