c# - Task.WhenAll 是否等待所有任务以防出现异常

标签 c# async-await task

我有两个任务。我用 Task.WhenAll 运行它们。如果其中之一抛出异常会怎样?另一个会完成吗?

最佳答案

只需运行这段代码来测试它:

private static async Task TestTaskWhenAll()
{
    try
    {
        await Task.WhenAll(
            ShortOperationAsync(),
            LongOperationAsync()
        );
    }
    catch (Exception exception)
    {
        Console.WriteLine(exception.Message); // Short operation exception
        Debugger.Break();
    }
}

private static async Task ShortOperationAsync()
{
    await Task.Delay(1000);
    throw new InvalidTimeZoneException("Short operation exception");

}

private static async Task LongOperationAsync()
{
    await Task.Delay(5000);
    throw new ArgumentException("Long operation exception");
}

调试器将在 5 秒后停止。两个异常都被抛出,但是 Debugger.Break() 只被命中一次。而且,exception 值不是AggregateException,而是InvalidTimeZoneException。这是因为新的 async/await 将展开到实际的异常中。您可以阅读更多here .如果您想读取其他Exceptions(不仅仅是第一个),您必须从 WhenAll 方法调用返回的 Task 中读取它们.

关于c# - Task.WhenAll 是否等待所有任务以防出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49403432/

相关文章:

c# - 使用 CSS 的页面属性为来自 asp.net c# 的每个打印页面添加页码

c# - 如何避免循环多线程任务中 JSON 序列化期间集合修改?

javascript - 暂停javascript异步功能直到用户操作

javascript - 异步函数总是返回 undefined

c# - 将异步方法作为 Quartz.NET 作业运行并处理对象问题

python - 生产中的 Redis-Queue (RQ) 任务队列

task - 如何从 phing 复制任务中排除目录

c# - WPF:防止用户离开 TextBox?

c# - 如何将用户输入的字符串作为字段名传递以访问对象中的字段?

c# - 在每个请求上验证 OpenId IdToken