Steven Tuub explains this well in his related blog post .
Parent and child tasks are often used when using Task in parallel. Note that when the parent Task has a child, the semantics of parent completion change subtly.
Parent / child tasks are almost never used when using Task in async . In the async world, you have a kind of โlogical relationship between parents and childrenโ when one async method calls another, but it is not really implemented using parent / child tasks.
Typically, a Task intended for use in async code does not expect the semantics of its completion to be altered by a child task attached to it. Thus, the new default value for Task.Run is DenyChildAttach , which prevents any child tasks from trying.
source share