【发布时间】:2016-06-27 10:28:00
【问题描述】:
我正在编写一个自定义的 FIFO 队列线程限制任务调度程序。
我希望能够保证未处理任务异常立即冒泡或升级,并继续结束流程。
我还希望能够
Task.Wait()和处理可能会弹出的AggregateException,而不会导致进程结束。
这两个要求可以同时满足吗?我是不是想错了?
更多信息
问题的症结在于我并不总是想Task.Wait() 完成一项任务。
在我的自定义任务调度器上执行任务后,我知道未处理的任务异常最终会escalate when the Task is cleaned up by the GC。
如果您不等待传播异常的任务或访问其 Exception 属性,则在对任务进行垃圾收集时,将根据 .NET 异常策略升级异常。
但谁知道在应用程序执行的环境中何时会发生这种情况 - 这无法在设计时确定。
对我来说,这意味着任务中未处理的异常可能-永远未被发现。这让我觉得很糟糕。
如果我想确保立即上报未处理的任务异常,我可以在任务执行后在我的任务调度程序中执行以下操作:
while ( taskOnQueue )
{
/// dequeue a task
TryExecuteTask(task);
if (task.IsFaulted)
{
throw task.Exception.Flatten();
}
}
但通过这样做,我基本上保证异常将始终终止进程,无论它如何通过在 Task.Wait()(或在 TaskScheduler.UnobservedException 事件处理程序中)捕获 AggregateException 来处理。
鉴于这些选项 - 我真的必须选择其中一个吗?
【问题讨论】:
标签: c# multithreading exception-handling .net-4.0 task-parallel-library