DetachedAndAttachedTasks

CSharp · Console

/Program.cs

using System;
using System.Threading;
using System.Threading.Tasks;
					
public class Program
{
	public static void Main()
	{
		//DetachedTask();
		//ParentWaitingForDetachedTask();
		//CreatingAttachedChildTask();
		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");
				Thread.SpinWait(500000);
				Console.WriteLine("Child task completed");
			});
		});
		parentTask.Wait();
		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");
				Thread.SpinWait(500000);
				Console.WriteLine("Child task completed");
				return "success";
			});
			
			Console.WriteLine(childTask.Result);
		});
		parentTask.Wait();
		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);
			}
		});
		parentTask.Wait();
		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);
		parentTask.Wait();
		Console.WriteLine("Parent task completed");
	}
}
;