.net - 为什么 Task.WhenAll 上的等待不抛出 AggregateException?

标签 .net exception asynchronous tap

在此代码中:

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 吗?

最佳答案

我知道这个问题已经得到解答,但所选答案并不能真正解决OP的问题,所以我想我会发布这个。

此解决方案为您提供聚合异常(即各个任务引发的所有异常)并且不会阻塞(工作流仍然是异步的)。

async Task Main()
{
    var task = Task.WhenAll(A(), B());

    try
    {
        var results = await task;
        Console.WriteLine(results);
    }
    catch (Exception)
    {
        if (task.Exception != null)
        {
            throw task.Exception;
        }
    }
}

public async Task<int> A()
{
    await Task.Delay(100);
    throw new Exception("A");
}

public async Task<int> B()
{
    await Task.Delay(100);
    throw new Exception("B");
}

关键是在等待聚合任务之前保存对聚合任务的引用,然后您可以访问它的 Exception 属性,该属性保存您的 AggregateException(即使只有一个任务抛出异常)。

希望这仍然有用。我知道我今天遇到了这个问题。

关于.net - 为什么 Task.WhenAll 上的等待不抛出 AggregateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007781/

相关文章:

c# - C# 中的全局异常处理(控制台应用程序)

java - Java 语言在哪里定义 Throwable 是否被检查?

asynchronous - 为什么 Future.timeout 在 dart 中不起作用?

c# - 开始使用 BouncyCaSTLe 加密 dll c#

c# - 具有多个内容的 WPF 样式

.net - 我的 .NET 2.0 应用程序将继续工作多久?

java - 自定义运行时异常不打印堆栈跟踪

javascript - 当方法可能会或可能不会异步获取数据时,应使用哪种 RxJS 类型?

asp.net-mvc - 带有客户端进度反馈的异步处理asp.net mvc

c# - "Use of unassigned variable"——变通办法?