任务中的默认任务创建选项跑
本文关键字:任务 选项 创建 默认 | 更新日期: 2023-09-27 18:13:19
为什么使用Task.Run
创建的Task
的CreationOptions
的默认值是DenyChildAttach
而不是None
?
这与简化C#5.0中新的async
和await
的工作有什么关系吗(我想是通过防止您逃离当前上下文的当前调度程序(?
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被选为快捷方式最常见和最简单的选项。