为什么默认值CreationOptions
一个的Task
使用创建Task.Run
是DenyChildAttach
而不是None
?
它有什么关系使工作与新的async
和await
在C#5.0简单(防止你逃跑当前上下文我猜的电流调度)?
为什么默认值CreationOptions
一个的Task
使用创建Task.Run
是DenyChildAttach
而不是None
?
它有什么关系使工作与新的async
和await
在C#5.0简单(防止你逃跑当前上下文我猜的电流调度)?
斯蒂芬Toub介绍了这口井在他关于这个问题的博客文章 。
家长和孩子的任务使用时有些常见的Task
并行方式秒。 请注意,当父Task
有一个孩子,父母的完成语义微妙地改变。
父/子任务时使用,几乎从来没有使用过Task
在一个s async
方式。 在async
的世界里,你有一种“逻辑父/子关系”,当一个async
方法调用另一个,但实际上并没有使用父/子任务的实现。
通常一个Task
用于在使用async
代码不期待有一个子任务连接到它改变它的完成语义。 因此,对于新的默认Task.Run
是DenyChildAttach
,这将阻止试图附加任何子任务。
为什么使用创造了一个任务的CreationOptions默认值Task.Run是DenyChildAttach而不是无?
没有(默认或其它)创建使用任务选项Task.Run方法 。
从引用Task.Run VS Task.Factory.StartNew(由Stephen Toub - MSFT) :
Task.Run(someAction);
完全等效于:
Task.Factory.StartNew ( someAction , CancellationToken.None , TaskCreationOptions.DenyChildAttach , TaskScheduler.Default );
MSDN文章嵌套任务和子任务(.NET 4.0 ,即没有为C#5.0 / .NET 4.5的任何equivokes)规定:
“在大多数情况下,我们建议您使用嵌套的任务,因为与其他任务的关系是那么复杂。这就是为什么里面的其他任务创建的任务默认情况下,嵌套,你必须明确指定AttachedToParent选项来创建一个子任务”
这就解释了为什么CreationOptions.DenyChildAttach
选择快捷方式的最常见和最简单的选择。