TaskCanceledExceptions是否传播到父任务?

时间:2016-12-19 00:35:24

标签: c# .net concurrency parallel-processing clr

这个article讨论了在分离的和附加的子任务之间传播TaskCanceledException的不同行为。但我自己尝试过,似乎两种情况都不会传播TaskCanceledException

class Program
{

    static void Main(string[] args)
    {
        var cts = new CancellationTokenSource();
        var ct = cts.Token;
        var task = Task.Factory.StartNew(() =>
        {
            var child1 = Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    ct.ThrowIfCancellationRequested();
                    Console.WriteLine("Ta!");
                    Thread.Sleep(1000);
                }
            }, ct, TaskCreationOptions.AttachedToParent, TaskScheduler.Default);

            var child2 = Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    ct.ThrowIfCancellationRequested();
                    Console.WriteLine("Da!");
                    Thread.Sleep(1000);
                }
            }, ct, TaskCreationOptions.None, TaskScheduler.Default);

        }, ct);

        Console.ReadKey();
        cts.Cancel();

        Console.ReadKey();
        try
        {
            task.Wait();
        }
        catch (AggregateException ae)
        {
            foreach (var e in ae.Flatten().InnerExceptions)
            {
                Console.WriteLine(e);
            }
        }

        Console.ReadKey();
    }
}

在上面的代码中,最后没有抛出AggregationException。而且,TaskCanceledException也不会传播到UnobservedTaskException事件。

因此,我想知道,如果关于取消的附加和分离子任务之间有什么区别吗?

谢谢!

0 个答案:

没有答案