当等待一个错误的任务(一个有异常集的任务)时,await
将重新抛出存储的异常。如果存储的异常是一个AggregateException
,它将重新抛出第一个并丢弃其余的。
我们怎样才能使用await
并同时扔掉原来的AggregateException
东西,这样我们才不会不小心丢失错误信息?
请注意,当然可以为此考虑一些 hacky 解决方案(例如 try-catch 周围的await
,然后调用Task.Wait
)。我真的很想找到一个干净的解决方案。这里的最佳做法是什么?
我想过使用自定义等待器,但内置TaskAwaiter
包含很多我不知道如何完全重现的魔法。它调用 TPL 类型的内部 API。我也不想重现所有这些。
如果你想玩它,这里有一个简短的重现:
static void Main()
{
Run().Wait();
}
static async Task Run()
{
Task[] tasks = new[] { CreateTask("ex1"), CreateTask("ex2") };
await Task.WhenAll(tasks);
}
static Task CreateTask(string message)
{
return Task.Factory.StartNew(() => { throw new Exception(message); });
}
只有两个异常之一被抛出Run
。
请注意,有关 Stack Overflow 的其他问题并未解决此特定问题。建议重复时请小心。