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

Chr*_*eis 6 .net continuations task task-parallel-library 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);
Run Code Online (Sandbox Code Playgroud)

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

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

这与uiScheduler有关吗?类似问题的解决方案基本上就是我正在做的事情 .通过等待任务或访问其Exception属性,没有观察到任务的异常.结果,未观察到的例外是

Ree*_*sey 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);
Run Code Online (Sandbox Code Playgroud)

这是因为TPL中关于异常处理的这一系列文档:

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

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