在此代码中:
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
,因为它正在等待的至少一项任务抛出了异常。相反,我返回的是其中一项任务引发的单个异常。
Does WhenAll
并不总是创建一个AggregateException
?
我知道这是一个已经回答的问题,但所选答案尚未回答really解决了OP的问题,所以我想我会发布这个。
该解决方案为您提供了聚合异常(即all各种任务引发的异常)并且不会阻塞(工作流仍然是异步的)。
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");
}
关键是在等待聚合任务之前保存对聚合任务的引用,然后您可以访问其保存 AggregateException 的 Exception 属性(即使只有一个任务抛出异常)。
希望这仍然有用。我知道我今天遇到了这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)