在任务继续执行过程中处理异常抛出

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());
1个回答

3

你的方法是我使用的方法,而且它很有效。

以下是一些与问题无关的附言:

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

除非需要更新控件,否则它们不一定需要在 UI 线程上。Helper 方法是个好主意。谢谢 :) - Dave New
1
很好。在这种情况下,我会建议不要总是将其安排在UI线程上(因为这会额外消耗资源),而是如果控件需要更新控件,则使用该控件进行调用。(这只是一个小问题,因为我们只讨论故障的情况)。 - Matt Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接