为什么子任务不会完成.ContinueWith?

时间:2013-11-15 11:23:24

标签: c# task parent-child

根据我的理解,ContinueWith方法等待有问题的任务完成。我是以下代码的情况,这意味着当它完成它的子任务时就完成了。如果这是真的,为什么它有时输出 0 0 0和其他时间0 1 2?

    static void Main(string[] args)
    {

        Task<Int32[]> parent = Task.Run(() =>
            {
                var results = new Int32[3];
                new Task(() => results[0] = 0, TaskCreationOptions.AttachedToParent).Start();
                new Task(() => results[1] = 1, TaskCreationOptions.AttachedToParent).Start();
                new Task(() => results[2] = 2, TaskCreationOptions.AttachedToParent).Start();

                return results;
            });

        var finalTask = parent.ContinueWith(n =>
        {
            foreach (Int32 i in n.Result)
                Console.WriteLine(i);
        });

        finalTask.Wait();

        Console.ReadLine();

    }

1 个答案:

答案 0 :(得分:3)

来自http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

  

将Action传递给Task.Run:

     

Task.Run(someAction);

     

这完全等同于:

     

Task.Factory.StartNew(someAction,       CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

这让我觉得它会阻止孩子们如预期那样附着。

确实将起跑线改为

Task<Int32[]> parent = Task.Factory.StartNew(() =>

似乎确实解决了这个问题。我通过查看http://msdn.microsoft.com/en-us/library/dd997417(v=vs.110).aspx使用Factory.StartNew方法而不是Run的方式做了不同的结论,得出了这个结论。

说过我不确定为什么当你试图附加任务时它没有抛出InvalidOperationException ......