6

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

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);

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

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

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

4

1 回答 1

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);

这是因为TPL 中有关异常处理的文档中的这一行:

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

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

于 2012-09-08T01:18:24.203 回答