在Task.Run默认TaskCreationOptions(Default TaskCreatio

2019-09-02 15:21发布

为什么默认值CreationOptions一个的Task使用创建Task.RunDenyChildAttach而不是None

它有什么关系使工作与新的asyncawait在C#5.0简单(防止你逃跑当前上下文我猜的电流调度)?

Answer 1:

斯蒂芬Toub介绍了这口井在他关于这个问题的博客文章 。

家长和孩子的任务使用时有些常见的Task并行方式秒。 请注意,当父Task有一个孩子,父母的完成语义微妙地改变。

父/子任务时使用,几乎从来没有使用过Task在一个s async方式。 在async的世界里,你有一种“逻辑父/子关系”,当一个async方法调用另一个,但实际上并没有使用父/子任务的实现。

通常一个Task用于在使用async代码不期待有一个子任务连接到它改变它的完成语义。 因此,对于新的默认Task.RunDenyChildAttach ,这将阻止试图附加任何子任务。



Answer 2:

为什么使用创造了一个任务的CreationOptions默认值Task.Run是DenyChildAttach而不是无?

没有(默认或其它)创建使用任务选项Task.Run方法 。

从引用Task.Run VS Task.Factory.StartNew(由Stephen Toub - MSFT) :

  • Task.Run“应该简单地被认为是一个快速的方法来使用Task.Factory.StartNew无需指定一堆参数,这是一个快捷键”
  • Task.Run(someAction); 完全等效于:

     Task.Factory.StartNew ( someAction , CancellationToken.None , TaskCreationOptions.DenyChildAttach , TaskScheduler.Default ); 
  • “通过这种方式,可以Task.Run和应该用于最常见的情况”

MSDN文章嵌套任务和子任务(.NET 4.0 ,即没有为C#5.0 / .NET 4.5的任何equivokes)规定:

“在大多数情况下,我们建议您使用嵌套的任务,因为与其他任务的关系是那么复杂。这就是为什么里面的其他任务创建的任务默认情况下,嵌套,你必须明确指定AttachedToParent选项来创建一个子任务”

这就解释了为什么CreationOptions.DenyChildAttach选择快捷方式的最常见和最简单的选择。



文章来源: Default TaskCreationOptions in Task.Run