我有一些父/子任务的层次结构:
var t1 = Task.Factory.StartNew(() =>
{
var t21 = Task.Factory.StartNew(() =>
{
throw new Exception("Inner fault");
}, TaskCreationOptions.AttachedToParent);
var t22 = t21.ContinueWith(ant =>
{
Console.WriteLine("Inner handler: " + ant.Exception.InnerException.Message);
}, TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.OnlyOnFaulted);
throw new Exception("Outer fault");
});
try
{
t1.Wait();
}
catch (AggregateException ae)
{
foreach (var e in ae.Flatten().InnerExceptions)
Console.WriteLine("Outer handler: " + e.Message);
}
结果,“外部处理程序”处理已经由“内部处理程序”处理的异常:
Inner handler: Inner fault
Outer handler: Outer fault
Outer handler: Inner fault
是否可以防止在“外部句柄”中处理已处理的异常(在我的示例中为“内部处理程序”)?
答案 0 :(得分:1)
如果您移除TaskCreationOptions.AttachedToParent
上的t21
,则会有效。
在这种情况下,您可能需要在t22.Wait()
中添加t1
来重现attached child task的行为。