using System.Threading.Tasks;
public static void Main()
PreventChildFromAttaching();
private static void DetachedTask()
var parentTask = Task.Factory.StartNew(() => {
Console.WriteLine("Parent task executing");
var childTask = Task.Factory.StartNew(() => {
Console.WriteLine("Child task executing");
Console.WriteLine("Child task completed");
Console.WriteLine("Parent task completed");
private static void ParentWaitingForDetachedTask()
var parentTask = Task.Factory.StartNew(() => {
Console.WriteLine("Parent task executing");
var childTask = Task.Factory.StartNew(() => {
Console.WriteLine("Child task executing");
Console.WriteLine("Child task completed");
Console.WriteLine(childTask.Result);
Console.WriteLine("Parent task completed");
private static void CreatingAttachedChildTask()
var parentTask = Task.Factory.StartNew(() => {
Console.WriteLine("Parent task executing");
for(int i = 0; i < 10; i++)
Task.Factory.StartNew((taskNo) => {
Console.WriteLine($"Attached child task {taskNo} completed");
}, i, TaskCreationOptions.AttachedToParent);
Console.WriteLine("Parent task completed");
private static void PreventChildFromAttaching()
var parentTask = Task.Factory.StartNew(() => {
Console.WriteLine("Parent task executing");
for(int i = 0; i < 10; i++)
Task.Factory.StartNew((taskNo) => {
Console.WriteLine($"Attached child task {taskNo} completed");
}, i, TaskCreationOptions.AttachedToParent);
}, TaskCreationOptions.DenyChildAttach);
Console.WriteLine("Parent task completed");