【问题标题】:What is the difference between a Nested Task and Child Task嵌套任务和子任务有什么区别
【发布时间】:2022-01-01 14:22:52
【问题描述】:

我想了解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 );
});

这里我附上代码。

似乎当我们开始任何嵌套任务时,外部任务可能会在内部任务之前完成,但在子任务的情况下,子任务总是在父任务之前完成。我不确定我是否正确。因此,如果有人指导我何时执行嵌套任务以及何时执行带有示例场景的子任务,将会很有帮助。谢谢

【问题讨论】:

    标签: c# task-parallel-library


    【解决方案1】:

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

    ...正在创建的任务作为子任务向该父任务注册, 导致两个额外的行为:父任务不会转换 到完成状态,直到其所有子项也完成, 并且来自故障子级的任何异常都将传播到 父任务(除非父任务之前观察到这些异常 完成)。

    【讨论】:

    • +1 表示实际行为差异的答案(以及详细说明和演示的博客文章的链接)。比其他答案中模糊的“与父级密切同步”短语有用得多。
    【解决方案2】:

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

    嵌套任务只是在用户中创建的任务实例 另一个任务的委托。子任务是一个嵌套任务,它是 使用 AttachedToParent 选项创建。一个任务可以创建任意数量 子和/或嵌套任务,仅受系统资源限制。这 以下示例显示了创建一个简单嵌套的父任务 任务。

    ...

    关于子任务与嵌套任务的最重要的一点是 嵌套任务本质上独立于父级或外部 任务,而附加的子任务与 父母。

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

    【讨论】:

    • 我很高兴你附加了第二部分,因为第一部分基本上描述了提问者的代码。
    • @OndrejJanacek 我认为仅官方文档的链接就足够了。我只插入一个引号来避免抱怨:D
    • 只发布一个链接是懒惰的 :) 从中找出重要的部分绝对是一种方法。
    • @OndrejJanacek 链接的文章专门针对这个问题。这都是相关的。确实是罕见的案例!不过我倾向于同意,提取肉给 OP 一个简洁的答案,并使我的输入看起来很专业,带有时髦的标记;)
    【解决方案3】:

    很简单,如果一个子任务未附加到父任务,那么该任务会失败吗?那么父任务状态仍然是"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);
    });
    

    【讨论】:

      猜你喜欢
      • 2017-02-10
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多