在此代码中:
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/