所有,关于上述主题存在很多问题,但我认为这有很大的不同以保证一个新问题。我有以下Task
和继续处理各种任务Status
; TaskStatus.RanToCompletion
,TaskStatus.Canceled
,当然还有AggregateException
来自TaskStatus.Faulted
。代码看起来像
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
asyncTask.ContinueWith(task =>
{
// Check task status.
switch (task.Status)
{
// Handle any exceptions to prevent UnobservedTaskException.
case TaskStatus.RanToCompletion:
if (asyncTask.Result)
{
// Do stuff...
}
break;
case TaskStatus.Faulted:
if (task.Exception != null)
mainForm.progressRightLabelText = task.Exception.InnerException.Message;
else
mainForm.progressRightLabelText = "Operation failed!";
default:
break;
}
}
这一切都运作良好,但我担心我是否正确这样做,因为有可能在延续中抛出AggregateException
- 那么呢?
我不希望在Wait
上asyncTask
,也不想继续,因为这将阻止返回UI线程。捕捉从延续中抛出的任何异常并不意味着我必须做这样的事情
Task parentTask = Task.Factory.startNew(() =>
{
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
Task continueTask = asyncTask.ContinueWith(task =>
{
// My continuation stuff...
}
try
{
continueTask.Wait();
}
catch(AggregateException aggEx)
{
// Some handling here...
}
});
这甚至会起作用吗?这里的最佳做法是什么?
一如既往,谢谢你的时间。
答案 0 :(得分:12)
你可以在你的代表中使用传统的try / catch来查看AggregateException
,或者你可以链接特定的延续,只有在使用{{1}的先行词出现故障时才会运行} 选项。后一种方法允许定义非常干净的任务工作流程。例如:
TaskContinuationOptions.OnlyOnFaulted
答案 1 :(得分:2)
Msdn在这个主题上写得很好:“{3}}
您会注意到他们只是使用try/catch(AggregateException
)块,然后过滤他们知道如何在ae.Handle(lambda)
中处理的异常,并在有一些无法处理的情况下停止应用。< / p>