为什么创建使用的默认值CreationOptions是而不是?TaskTask.RunDenyChildAttachNone
这与使新的async和awaitC# 5.0 中的工作更简单有关吗(通过防止您逃避当前上下文的当前调度程序,我猜)?
为什么创建使用的默认值CreationOptions是而不是?TaskTask.RunDenyChildAttachNone
这与使新的async和awaitC# 5.0 中的工作更简单有关吗(通过防止您逃避当前上下文的当前调度程序,我猜)?
Stephen Toub在他关于这个主题的博客文章中很好地解释了这一点。
Task以并行方式使用 s时,父子任务有些常见。请注意,当父母Task有孩子时,父母的完成语义会发生微妙的变化。
以某种方式使用Tasks时,几乎从不使用父/子任务。async在async世界上,当一个方法调用另一个方法时,您有一种“逻辑父/子关系” async,但实际上并没有使用父/子任务来实现。
通常Task用于async代码的 a 不期望其完成语义被附加到它的子任务更改。因此,新的默认值Task.Run是DenyChildAttach,它可以防止任何子任务尝试附加。
为什么使用 Task.Run 创建的任务的 CreationOptions 的默认值是 DenyChildAttach 而不是 None?
使用Task.Run Method创建任务时没有(默认或其他)选项。
引用Task.Run vs Task.Factory.StartNew (Stephen Toub - MSFT):
Task.Run(someAction);完全等同于:
Task.Factory.StartNew
( someAction
, CancellationToken.None
, TaskCreationOptions.DenyChildAttach
, TaskScheduler.Default
);
MSDN 文章Nested Tasks and Child Tasks (for .NET 4.0 , ie without any equivokes for C# 5.0/.NET 4.5) 指出:
“在大多数情况下,我们建议您使用嵌套任务,因为与其他任务的关系不太复杂。这就是为什么在其他任务中创建的任务默认嵌套的原因,您必须显式指定 AttachedToParent 选项才能创建子任务”
这解释了为什么CreationOptions.DenyChildAttach选择快捷方式最常见和最简单的选项。