await
将重新抛出存储的异常。如果存储的异常是AggregateException
,它将重抛第一个异常并丢弃其余的异常。我们如何在使用
await
的同时抛出原始的AggregateException
,以便不会意外丢失错误信息?请注意,当然可以考虑一些hacky解决方案(例如,在
await
周围放置try-catch,然后调用Task.Wait
)。我真的希望找到一个简洁的解决方案。在这里,什么是最佳实践?我想使用自定义awaiter,但内置的
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上的其他问题并没有解决这个具体的问题。在建议重复内容时请小心。
await
的异常处理。http://blogs.msdn.com/b/pfxteam/archive/2011/09/28/10217876.aspx - Matthew Watson