【发布时间】:2012-04-10 20:06:13
【问题描述】:
所有,关于上述主题有很多问题,但我相信这有足够的不同,需要提出一个新问题。我有以下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 - 然后呢?
我不想在我的asyncTask 上Wait 也不想继续,因为这会阻止返回到 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...
}
});
这还能用吗?这里的最佳做法是什么?
一如既往,感谢您的宝贵时间。
【问题讨论】:
-
我见过“跑到完成”的任务,实际上它们抛出了 AggregateException。这种错误处理是行不通的。为什么不直接使用 try/catch?
-
你的意思是在后台线程调用的方法中,还是在实际的延续委托方法中?
标签: c# exception-handling task-parallel-library continuations