任务继续(OnlyOnFaulted)仍然会获得未观察到的异常

时间:2012-09-08 01:05:24

标签: .net task-parallel-library task continuations unobserved-exception

我有一个继续处理错误的任务:

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
var loadTask = Task<List<OrderItemViewModel>>.Factory.StartNew(() =>
{
       throw new Exception("derp");
});

var errorContinue = loadTask.ContinueWith(t =>
    {
        MainViewModel.RemoveViewModel(this);
    }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler);

继续命中,但几秒钟后我在应用程序中收到此错误:

  

通过等待任务未观察到任务的异常   或访问其Exception属性。结果,没有观察到   终结器线程重新抛出异常。

这与uiScheduler有关吗?类似问题的解决方案基本上就是我正在做的A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was

1 个答案:

答案 0 :(得分:6)

您需要实际处理(或至少观察)异常:

var errorContinue = loadTask.ContinueWith(t =>
{
    // Observe/acknowledge the exception.  
    // You can use t.Wait(), which throws, or just grab the exception
    var exception = t.Exception; 
    MainViewModel.RemoveViewModel(this);
}, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, uiScheduler);

这是因为documentation on exception handling in the TPL

的这一行
  

如果您没有等待传播异常的任务或访问其Exception属性,则在对任务进行垃圾回收时,将根据.NET异常策略升级异常。

在你的情况下,你有一个延续,但你实际上从未“等待异常”或访问它的异常属性。我的回答(在您发布的相关问题中)的作用是我实际上使用在通过延续的任务上的Exception属性。