嵌套任务和单独任务之间的区别

时间:2012-08-27 06:38:33

标签: .net .net-4.0 task-parallel-library

我试图理解TPL中嵌套任务的概念。在什么条件下最好创建嵌套任务而不是创建两个单独的任务,因为在嵌套任务的情况下,它完全独立于父。

使用父任务的本地队列是否有任何性能提升?

1 个答案:

答案 0 :(得分:0)

这是msdn documentation

首先,“嵌套任务”只是意味着您在另一个任务中启动新任务,如下所示:

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

您可能想要的是“嵌套任务”和“子任务”

之间的区别

“儿童任务”看起来像这样:

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

子任务将强制执行与父任务的某些同步。

因为,子任务总是比独立的嵌套任务具有更高的同步开销,所以你会想知道为什么你可能想要使用它们。

有时您希望确保这些任务的同步。您希望childTask在父任务完成之前计算某些内容。其他时候,它可能只会使调试变得更容易,因为你将不得不处理更少的非确定性。

较少的非确定性,可以帮助您更快地编写和测试代码。

虽然我不确定它是以这种方式实现的,但是有可能将子任务注入到与父项相同的线程/核心上,特别是当父级只是在等待子任务时。在这种情况下,您可以从子任务中的父任务获得缓存的额外好处。

(这似乎是一个不错的主意,但我不认为它是以那种方式实现的,如果我错了就纠正我。)