我已經閱讀了很多關於如何處理TPL中的異常但不太明白的地方。處理Tpl中的異常
讓我們這個例子代碼:
var task1 = new Task(() => { throw new Exception("Throw 1"); });
var task2 = task1.ContinueWith(t => Console.WriteLine("Catch 1:{0}", t.Exception.Message),
TaskContinuationOptions.OnlyOnFaulted);
var task3 = task2.ContinueWith(t => Console.WriteLine("Continuation"));
task1.Start();
try {
task1.Wait();
}
catch (Exception ex) {
Console.WriteLine("Wait Exception: {0}", ex.Message);
}
我預計打印
Catch 1
Continuation
,但我得到
Catch 1
Continuation
Wait Exception
這意味着異常仍然被認爲是未處理的當任務完成並且任務終結器將最終拆除應用程序。
如何處理延續內部的異常,使終結器不會拋出?與此同時,我希望任務保持在故障狀態,因此將任務包裝在try/catch中將不起作用。
背景是,我想要實現的異步事件模式作爲指定here但錯誤處理。我完整的代碼看起來像這樣
public IAsyncResult Begin(AsyncCallback callback, object state, Action action) {
var task1 = new Task(action);
var task2 = task1.ContinueWith(t => HandleException(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
if (callback != null) {
var task3 = task2.ContinueWith(t => callback(t),
TaskScheduler.FromCurrentSynchronizationContext());
var task4 = task3.ContinueWith(t => HandleException(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
}
task1.Start();
return task;
}
我想在繼續嘗試中調用't.Wait()'並忽略異常。但是這是行不通的,因爲繼續可能會在另一個Wait()拋出之後執行。 – svick 2012-03-30 20:39:35