如何使用父级和子级的 Wait() 处理不同的任务异常.继续

本文关键字:处理 任务 继续 异常 Wait 何使用 | 更新日期: 2023-09-27 18:30:17

>我有一些父/子任务的层次结构:

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

是否可以阻止在"外部句柄"(在我的示例中为"内部处理程序")中处理已处理的异常?

如何使用父级和子级的 Wait() 处理不同的任务异常.继续

如果您删除t21上的TaskCreationOptions.AttachedToParent,它可以工作。

在这种情况下,您可能希望在t1中添加t22.Wait()以重现附加的子任务的行为。