所有,關於上述主題有很多問題,但我相信這是完全不同的,以保證新的問題。我有以下Task
和延續處理各種任務Status
; TaskStatus.RanToCompletion
,TaskStatus.Canceled
,當然還有AggregateException
,通過TaskStatus.Faulted
。代碼看起來像TPL和異常處理
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...
}
});
這會甚至工作?這裏最好的做法是什麼?
一如既往,感謝您的時間。
我見過任務「跑到完成」,實際上他們拋出一個AggregateException。這種錯誤處理不起作用。爲什麼不使用try/catch? – 2012-03-27 09:52:26
您的意思是在後臺線程或實際延續委託方法中調用的方法中? – MoonKnight 2012-03-27 09:53:03