【问题标题】:Difference between a nested task and a separate task嵌套任务和单独任务之间的区别
【发布时间】:2014-09-20 20:11:45
【问题描述】:

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

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

【问题讨论】:

  • 您能描述一下“嵌套任务”的确切含义吗?
  • 嗨 SVICK,根据msdn.microsoft.com/en-us/library/dd997417.aspx。嵌套任务只是在另一个任务的用户委托中创建的 System.Threading.Tasks.Task 实例。子任务是使用 AttachedToParent 选项创建的嵌套任务。我想了解嵌套任务的用途以及它如何有用或何时应该使用它......

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


【解决方案1】:

这是关于这个的 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 在父任务完成之前计算一些东西。其他时候,它可能只是让调试更容易,因为您将不得不处理更少的不确定性。

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

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

(这似乎是个好主意,但我不认为它是这样实现的,如果我错了,请纠正我)。

【讨论】:

  • 对不起,你完全弄错了..我想知道创建嵌套任务的必要性以及我们可以从中获得什么优势而不是创建新任务......跨度>
  • @RaoBHavik 我的回答的后半部分描述了您将它用于同步,并更容易地对程序进行推理,但由于同步而导致相关的减速。据我所知,没有任何其他区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多