我有两个任务。我用 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/