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()); 

回答

3

您的方法是我使用的方法,它运行良好。

一对夫妇是不是关于这个问题的旁白:

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

它们不一定需要在UI线程上,除非需要一些控件更新。辅助方法是一个好主意。谢谢:) – davenewza

+1

太好了。在这种情况下,我会说没有总是在UI线程上安排它(因为这需要额外的费用),而且,如果控件需要更新控件,请使用该控件进行调用。 (这是一个小问题,因为我们只是在讨论故障的情况)。 –