似乎没有内置的方法来处理这个问题(几乎 2 周后没有回答这个问题)。我已经推出了一些自定义代码来解决这个问题。解决方案描述很长,所以我已经在我的博客中发布了。有兴趣可以参考这篇文章。
2010 年 5 月 7 日更新:我找到了一种更好的方法,即利用任务延续。我创建了一个class ThreadFactory
暴露 Error 事件的事件,该事件可由顶级处理程序订阅,并提供方法来启动附加了正确延续的任务。
代码张贴在这里。
2011 年 4 月 18 日更新:根据 Nifle 的评论从博客文章中发布代码。
internal class ThreadFactory
{
public delegate void TaskError(Task task, Exception error);
public static readonly ThreadFactory Instance = new ThreadFactory();
private ThreadFactory() {}
public event TaskError Error;
public void InvokeError(Task task, Exception error)
{
TaskError handler = Error;
if (handler != null) handler(task, error);
}
public void Start(Action action)
{
var task = new Task(action);
Start(task);
}
public void Start(Action action, TaskCreationOptions options)
{
var task = new Task(action, options);
Start(task);
}
private void Start(Task task)
{
task.ContinueWith(t => InvokeError(t, t.Exception.InnerException),
TaskContinuationOptions.OnlyOnFaulted |
TaskContinuationOptions.ExecuteSynchronously);
task.Start();
}
}