为什么创建使用的默认值CreationOptions
是而不是?Task
Task.Run
DenyChildAttach
None
这与使新的async
和await
C# 5.0 中的工作更简单有关吗(通过防止您逃避当前上下文的当前调度程序,我猜)?
为什么创建使用的默认值CreationOptions
是而不是?Task
Task.Run
DenyChildAttach
None
这与使新的async
和await
C# 5.0 中的工作更简单有关吗(通过防止您逃避当前上下文的当前调度程序,我猜)?
Stephen Toub在他关于这个主题的博客文章中很好地解释了这一点。
Task
以并行方式使用 s时,父子任务有些常见。请注意,当父母Task
有孩子时,父母的完成语义会发生微妙的变化。
以某种方式使用Task
s时,几乎从不使用父/子任务。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
选择快捷方式最常见和最简单的选项。