C# 处理任务继续中某个位置引发的异常

C# 处理任务继续中某个位置引发的异常,c#,.net,multithreading,exception-handling,task-parallel-library,C#,.net,Multithreading,Exception Handling,Task Parallel Library,处理任务延续中抛出的异常的最佳方法是什么 例如,我在下面有一个简单的任务延续(updateMessages->updateInterface),但实际上这可能是一个由两个以上任务组成的链。我希望有一个通用的异常“catch all”任务,它可以从链中可能发生的任何故障继续执行 我如何做到这一点是通过定义一个操作(观察并记录异常)并使用TaskContinuationOptions.OnlyOnFaulted集从每个任务继续。有没有更好的办法 Task updateMessages = Task.

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

例如,我在下面有一个简单的任务延续(
updateMessages
->
updateInterface
),但实际上这可能是一个由两个以上任务组成的链。我希望有一个通用的异常“catch all”任务,它可以从链中可能发生的任何故障继续执行

我如何做到这一点是通过定义一个
操作
(观察并记录异常)并使用
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());
Task updateMessages=Task.Factory.StartNew(()=>
{
//做事
});
Task updateInterface=updateMessages.ContinueWith(Task=>
{
//用户界面更新
}, 
System.Threading.CancellationToken.None,
TaskContinuationOptions.NotUnfault,
TaskScheduler.FromCurrentSynchronizationContext());
操作失败操作=新操作(失败任务=>
{
//观察并记录异常
});
updateMessages.ContinueWith(failureAction、CancellationToken.None、,
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());
updateInterface.ContinueWith(failureAction、CancellationToken.None、,
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());

您的方法就是我使用的方法,而且效果很好

以下是一些与问题无关的旁白:

  • 您的failureAction真的需要在主UI线程上运行吗
  • 我将编写一个helper方法来附加失败延续,因为每个任务都要这样做

除非需要一些控件更新,否则它们不一定需要在UI线程上。helper方法是个好主意。谢谢:)太好了。在这种情况下,我想说的是,不要总是在ui线程上调度它(因为这需要额外的成本),相反,如果控件需要更新控件,请使用该控件进行调用。(这是一个小问题,因为我们只讨论故障的情况)。