9

为什么创建使用的默认值CreationOptions是而不是?TaskTask.RunDenyChildAttachNone

这与使新的asyncawaitC# 5.0 中的工作更简单有关吗(通过防止您逃避当前上下文的当前调度程序,我猜)?

4

2 回答 2

10

Stephen Toub在他关于这个主题的博客文章中很好地解释了这一点。

Task以并行方式使用 s时,父子任务有些常见。请注意,当父母Task有孩子时,父母的完成语义会发生微妙的变化。

以某种方式使用Tasks时,几乎从不使用父/子任务。asyncasync世界上,当一个方法调用另一个方法时,您有一种“逻辑父/子关系” async,但实际上并没有使用父/子任务来实现。

通常Task用于async代码的 a 不期望其完成语义被附加到它的子任务更改。因此,新的默认值Task.RunDenyChildAttach,它可以防止任何子任务尝试附加。

于 2013-05-11T19:45:22.547 回答
7

为什么使用 Task.Run 创建的任务的 CreationOptions 的默认值是 DenyChildAttach 而不是 None?

使用Task.Run Method创建任务时没有(默认或其他)选项。

引用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 文章Nested Tasks and Child Tasks (for .NET 4.0 , ie without any equivokes for C# 5.0/.NET 4.5) 指出:

“在大多数情况下,我们建议您使用嵌套任务,因为与其他任务的关系不太复杂。这就是为什么在其他任务中创建的任务默认嵌套的原因,您必须显式指定 AttachedToParent 选项才能创建子任务”

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

于 2013-05-11T19:48:55.980 回答