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());
它们不一定需要在UI线程上,除非需要一些控件更新。辅助方法是一个好主意。谢谢:) – davenewza
太好了。在这种情况下,我会说没有总是在UI线程上安排它(因为这需要额外的费用),而且,如果控件需要更新控件,请使用该控件进行调用。 (这是一个小问题,因为我们只是在讨论故障的情况)。 –