首页 > 解决方案 > TaskContinuationOptions.AttachedToParent 的理解

问题描述

MSDN 说的用法TaskContinuationOptions.AttachedToParent

指定延续(如果它是子任务)附加到任务层次结构中的父级。只有当它的前件也是子任务时,延续才可以是子任务。

以下是一些代码和我对其用法的理解,如果我错了,请纠正我:

class Program
{
   static void Main(string[] args) {
      Task<Int32[]> parent = new Task<Int32[]>(() => {
         var results = new Int32[4]; 

         // ugly syntax, just for demo purpose
         Task child1 = new Task(() => results[0] = Sum(10000), TaskCreationOptions.AttachedToParent);
         Task child2 = new Task(() => results[1] = Sum(20000), TaskCreationOptions.AttachedToParent);
         Task child3 = new Task(() => results[2] = Sum(30000), TaskCreationOptions.AttachedToParent);
         Task child4 = new Task(() => results[2] = Sum(40000), TaskCreationOptions.AttachedToParent);
         Task childX = child4.ContinueWith(child4Task => Console.WriteLine("child4 done"), TaskContinuationOptions.AttachedToParent);

         child1.Start();
         child2.Start();
         child3.Start();
         child4.Start();
         return results;
      });

      // When the parent and its children have run to completion, display the results
      parent.ContinueWith(parentTask => Array.ForEach(parentTask.Result, Console.WriteLine));
      parent.Start();
   }

   static Int32 Sum(Int32 n) {
      Int32 sum = 0;
      for (; n > 0; n--)
         checked { sum += n; } 
      return sum;
   }
}

我有两个问题:

Q1-我的理解TaskContinuationOptions.AttachedToParent是,当我这样做时Task childX = child4.ContinueWith(child2Task => Console.WriteLine("child4 done"), TaskContinuationOptions.AttachedToParent);childX就像一个孩子5 parent,所以childX会在完成之前parent完成。

但是如果我不使用标志作为Task childX = child4.ContinueWith(child2Task => Console.WriteLine("child4 done"));

那么childX不被认为是的孩子parent,因此childX可以在完成后parent完成,我的理解是否正确?

Q2-TaskContinuationOptions.AttachedToParent如果任务本身不是子任务,则没有意义,例如,如果我执行parent为:

parent.ContinueWith(..., TaskContinuationOptions.AttachedToParent);
parent.Start();

那么这行代码就没有意义了,是吗?如果它没有意义,因为它没有父级,那么 CLR 应该抛出一个异常,说“XXX 没有父级任务等等等等”,但是 CLR 没有抛出这样的异常,为什么?

标签: c#.net

解决方案


推荐阅读