我有一个方法可以创建一些任务,然后用 WaitAll 等待它们在返回之前。问题是,如果这些任务被取消,那么 WaitAll 会抛出 AggregateException包含大量 TaskCanceledException s。
这意味着 WaitAll 将在两种不同的情况下抛出异常:
后者完全符合 vexing exception 的定义。 : 这是在完全非异常情况下抛出的异常,所以我必须捕获它才能恢复正常的控制流程。幸运的是,它很容易被捕获,对吧?只需添加
catch (AggregateException)
并且 -- 哦等等,这与发生 fatal error 时抛出的类型相同。
我确实需要在返回之前等待任务完成运行(我需要知道他们不再使用他们的数据库连接、文件句柄或其他任何东西),所以我确实需要 WaitAll 或类似的东西。如果任何任务出现故障,我确实希望这些异常作为未处理的异常传播。我只是不想取消异常(exception)。
我该如何预防
WaitAll
从为取消的任务引发异常?
请您参考如下方法:
AggregateException
提供Handle
可以用于这些情况的方法。例如,如果您想忽略 TaskCanceledException
你可以做:
var all = new AggregateException(
new NullReferenceException(),
new TaskCanceledException(),
new TaskCanceledException(),
new InvalidOperationException(),
new TaskCanceledException());
try
{
throw all;
}
catch (AggregateException errors)
{
errors.Handle(e => e is TaskCanceledException);
}
如果所有异常都是
TaskCanceledException
类型,
Handle
方法不会抛出任何异常;否则一个新的
AggregateException
仅包含未处理的异常将被抛出。