大家好,虽然与上述主题有许多问题,但我认为这个问题足够不同,需要提出一个新问题。我有以下的任务(Task)
和一个用来处理多种任务状态(Status)
的延续; TaskStatus.RanToCompletion
, TaskStatus.Canceled
和当然是通过TaskStatus.Faulted
的AggregateException
。代码如下:
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
和continuation,因为这会阻塞返回到UI线程。要捕获从continuation中抛出的任何异常肯定不能意味着我必须像这样做吧。
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...
}
});
这会有效吗?这里的最佳实践是什么?
像往常一样,感谢您的时间。