我有一个创建一些任务的方法,然后在返回之前使用WaitAll等待它们。问题是,如果这些任务被取消,那么 WaitAll 会抛出一个包含大量TaskCanceledException的AggregateException。
这意味着 WaitAll 将在两种不同的情况下抛出异常:
- 表示真正错误的异常。这意味着存在我们不知道如何处理的情况;它们需要作为未处理的异常传播,直到它们最终终止进程。
- 指示用户单击取消按钮的异常。这意味着任务被取消和清理,程序应该继续正常运行。
后者完全符合令人烦恼的异常的定义:它是在完全非异常情况下抛出的异常,因此我必须捕获它才能恢复正常的控制流。幸运的是,它很容易被抓住,对吧?只需添加catch (AggregateException)
- 哦等等,这与出现致命错误时抛出的类型相同。
我确实需要在返回之前等待任务完成运行(我需要知道他们不再使用他们的数据库连接、文件句柄或其他任何东西),所以我确实需要 WaitAll 或类似的东西。如果任何任务出现故障,我确实希望这些异常作为未处理的异常传播。我只是不想取消例外。
如何防止WaitAll
为取消的任务引发异常?