public static void Do(ParentTaskOpt opt)
        {
            IList <Task> continuationList = new List <Task>();
            Task         task             = Task.Factory.StartNew(() => ParentAction(opt));
            Task         next;

            switch (opt)
            {
            case ParentTaskOpt.A:
                next = task.ContinueWith(ant =>
                {
                    Thread.Sleep(1000);
                    System.Console.WriteLine("Simple continuation");
                });
                break;

            case ParentTaskOpt.B:
                next = task.ContinueWith(ant =>
                {
                    System.Console.WriteLine(ant.Exception?.Message);
                }, TaskContinuationOptions.OnlyOnFaulted);
                break;

            case ParentTaskOpt.C:
                break;

            default:
                next = new Task(() => {});
                break;
            }

            next.ContinueWith(ant => System.Console.WriteLine("Stop")).Wait();
        }
        private static void ParentAction(object opt)
        {
            TaskCreationOptions atp    = TaskCreationOptions.AttachedToParent;
            ParentTaskOpt       option = (ParentTaskOpt)opt;

            switch (option)
            {
            case ParentTaskOpt.A:
                Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(1000);
                    System.Console.WriteLine("Case A");
                });
                break;

            case ParentTaskOpt.B:
                Task.Factory.StartNew(() => { throw null; }, atp);
                break;

            default:
                System.Console.WriteLine("Default");
                break;
            }
        }