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

.net 任务继续(OnlyOnFaulted)仍然得到未观察到的异常,.net,task-parallel-library,task,continuations,unobserved-exception,.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.Co

我有一个任务,该任务带有一个处理错误的延续:

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);
var-uiScheduler=TaskScheduler.FromCurrentSynchronizationContext();
var loadTask=Task.Factory.StartNew(()=>
{
抛出新异常(“derp”);
});
var errorContinue=loadTask.ContinueWith(t=>
{
MainViewModel.RemoveViewModel(此);
},CancellationToken.None,TaskContinuationOptions.OnlyOnFaulted,uiScheduler);
继续被命中,但几秒钟后,我在应用程序中收到此错误:

等待任务时也未观察到任务的异常 或访问其异常属性。因此,未被观察到的 终结器线程重新引发了异常


这与uiScheduler有关吗?类似问题的解决方案基本上是我正在做的

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

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);
这是因为这一行:

如果您不等待传播异常的任务,也不访问其异常属性,则在对该任务进行垃圾收集时,将根据.NET异常策略升级该异常


在您的例子中,您有一个延续,但您实际上从未“等待异常”或访问它的异常属性。我的回答(在您发布的相关问题中)有效的原因是,我实际上在继续部分传递的任务上使用了Exception属性。

自编写此答案以来,Microsoft已更改了.NET异常策略。参见第页的未观察到的异常