2013-11-15 46 views
2

就我的理解而言,ContinueWith方法等待所讨论的任务完成。下面的代码的情况下,这意味着它完成时,它完成了它的子任务。如果这是真的,为什么它有时输出 0 0 0和其他时间0 1 2?为什么孩子的任务不会在完成之前完成.ContinueWith?

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(); 

    } 
+0

@HansPassant:从表面上看,它看起来像子任务是附着于母所以父母直到孩子们都没有完成。因此,OP已经编写了旨在正确使用'ContinueWith'的代码。问题是当子任务未能附加到父项时,它没有抛出期望的异常。轻微的代码更改完全能够在不触及“ContinueWith”的情况下获得理想的结果。 – Chris

回答

2

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

当你传递一个行动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当您尝试附加任务...

相关问题