觀察任務內拋出的異常有多種方式。其中之一是與OnlyOnFaulted一個ContinueWith:在ContinueWith中觀察任務異常
var task = Task.Factory.StartNew(() =>
{
// Throws an exception
// (possibly from within another task spawned from within this task)
});
var failureTask = task.ContinueWith((t) =>
{
// Flatten and loop (since there could have been multiple tasks)
foreach (var ex in t.Exception.Flatten().InnerExceptions)
Console.WriteLine(ex.Message);
}, TaskContinuationOptions.OnlyOnFaulted);
我的問題:你的例外自動成爲一次failureTask開始觀察到的,還是他們只能成爲觀測一次我「觸摸」 ex.Message?
你是什麼意思的觀察?您的ContinueWith委託只會被調用一次,如果這就是您的意思,無論您是否訪問該異常對象。 – 2012-07-31 15:40:37
也許他的意思是「如果我簡單地調用'OnlyOnFaulted'而不管訪問't.Exceptions'」是否會重新拋出異常? – user7116 2012-07-31 15:45:25
如果您不「觀察」任務引發的異常(這是Microsoft術語),那麼垃圾收集器將在稍後爲您拋出它們。我的ContinueWith委託肯定會被多次調用(如果在我的主任務中有多個任務會拋出異常),或者它可以用帶有所有拋出的異常的AggregateException樹調用? – davenewza 2012-07-31 15:47:18