任务中的默认任务创建选项跑

本文关键字:任务 选项 创建 默认 | 更新日期: 2023-09-27 18:13:19

为什么使用Task.Run创建的TaskCreationOptions的默认值是DenyChildAttach而不是None

这与简化C#5.0中新的asyncawait的工作有什么关系吗(我想是通过防止您逃离当前上下文的当前调度程序(?

任务中的默认任务创建选项跑

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

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

async方式使用Task时,几乎从不使用父/子任务。在async世界中,当一个async方法调用另一个方法时,您有一种"逻辑父/子关系",但它实际上并不是使用父/子任务实现的。

通常,用于async代码的Task不希望其完成语义因附加到其上的子任务而发生更改。因此,Task.Run的新默认值是DenyChildAttach,它可以防止任何子任务尝试附加。

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

使用task创建任务时没有(默认或其他(选项。Run方法。

引用任务。跑步与任务。工厂StartNew(作者Stephen Toub-MSFT(:

  • 任务。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(对于.NET 4.0,即对于C#5.0/.NET 4.5没有任何等价物(指出:

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

这就解释了为什么CCD_ 19被选为快捷方式最常见和最简单的选项。