3

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

例如,我在下面有一个简单的任务延续(updateMessages-> updateInterface),但实际上这可能是一个超过 2 个任务的链。我想要一个通用的异常“全部捕获”任务,该任务从链中可能发生的任何故障继续。

我如何做到这一点是通过定义一个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());
4

1 回答 1

3

您的方法是我使用的方法,并且效果很好。

一些与问题无关的旁白:

  • 您的 failureAction 真的需要在主 UI 线程上运行吗?
  • 我会编写一个辅助方法来附加失败的延续,因为您将对每项任务都执行此操作。
于 2012-11-13T16:59:57.890 回答