处理任务延续中某处抛出的异常

时间:2012-11-13 09:53:12

标签: c# .net multithreading exception-handling task-parallel-library

处理任务延续中某处抛出的异常的最佳方法是什么?

例如,我在下面有一个简单的任务延续(updateMessages - > updateInterface),但实际上这可能是一个超过2个任务的链。我希望有一个通用异常“catch all”任务,它可以从链中可能出现的任何错误继续。

我是如何做到这一点的方法是定义Action(观察并记录异常)并继续使用TaskContinuationOptions.OnlyOnFaulted设置的每个任务。是否有更好的方法可以做到这一点?

Task updateMessages = Task.Factory.StartNew(() =>
{
    // Do stuff
});

Task updateInterface = updateMessages.ContinueWith(task =>
  {
    // UI updates
  }, 
  System.Threading.CancellationToken.None, 
  TaskContinuationOptions.NotOnFaulted,
  TaskScheduler.FromCurrentSynchronizationContext());

Action<Task> failureAction = new Action<Task>(failedTask =>
{
    // Observe and log exceptions
});

updateMessages.ContinueWith(failureAction, CancellationToken.None,
                            TaskContinuationOptions.OnlyOnFaulted,
                            TaskScheduler.FromCurrentSynchronizationContext());
updateInterface.ContinueWith(failureAction, CancellationToken.None,          
                             TaskContinuationOptions.OnlyOnFaulted, 
                             TaskScheduler.FromCurrentSynchronizationContext());

1 个答案:

答案 0 :(得分:3)

你的方法是我使用的方法,而且效果很好。

一些与问题无关的旁白:

  • 你的failureAction真的需要在主UI线程上运行吗?
  • 我会编写一个辅助方法来附加失败延续,因为你将在每个任务中执行此操作。