嵌套任务和子任务之间有什么区别

时间:2013-11-18 13:02:24

标签: c# task-parallel-library

我想了解Nested Task and Child Task之间的区别。

var outerTask = Task.Factory.StartNew( () => 
{
    var nestedTask = Task.Factory.StartNew( () => 
    {
         Console.WriteLine("Inside nestedTask");
    });
});


A "child task" looks like this:

var parentTask = Task.Factory.StartNew( () => 
{
    var childTask = Task.Factory.StartNew( () => 
    {
         Console.WriteLine("Inside childTask");
    },               TaskCreationOptions.AttachedToParent );
});

这里我附上了代码。

似乎当我们启动任何嵌套任务时,外部任务可以在内部任务之前完成,但是在子任务的情况下总是在父任务之前完成子任务。我不确定我是对还是不对。因此,如果有人指导我何时去嵌套任务和带有示例场景的子任务,那将会很有帮助。感谢

3 个答案:

答案 0 :(得分:7)

IMO,最好的解释见Stephen Toub's blog post

  

...正在创建的任务作为子进程向该父进程注册,   导致另外两个行为:父任务不会转换   到完成状态,直到所有孩子都完成,   任何有故障的孩子的例外情况都会传播到   parent Task(除非父Task在之前观察到这些异常   它完成了。)

答案 1 :(得分:5)

微软很好地解释了这一点。

  

嵌套任务只是在用户中创建的Task实例   代表另一项任务。子任务是一个嵌套任务   使用AttachedToParent选项创建。任务可以创建任何数字   子任务和/或嵌套任务,仅受系统资源的限制。该   以下示例显示了创建一个简单嵌套的父任务   任务。

     

...

     

关于儿童与嵌套任务的最重要的一点是   嵌套任务基本上独立于父或外   任务,而附加的子任务非常紧密地同步   父母。

http://msdn.microsoft.com/en-us/library/vstudio/dd997417%28v=vs.100%29.aspx

答案 2 :(得分:0)

简单,如果未将一个子任务附加到父任务,那么该任务失败了吗?然后,父任务状态仍为“ RanToCompletion”

var parentTask = Task.Factory.StartNew(() =>
{
    var childTask = Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Inside childTask");
    }, TaskCreationOptions.AttachedToParent);

    var childTask2 = Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000 * 3);
        throw new Exception("Bomb2");
        Console.WriteLine("Inside childTask2");
    }, **TaskCreationOptions.None**);   // If not AttachedToParent, parentTask.Status == RanToCompletion
}).ContinueWith(t =>
{
    Console.WriteLine(t.Status);
});