CSharp · Console
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");
}
}