我有一个继续处理错误的任务:
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
答案 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属性。