In this example I’m showing the launching of further tasks within an existing task.
The Main
method launches a single task (of course, it would likely be many tasks in a real system) which is implemented by MainTask
and then waits for that task to complete. The MainTask
then launches many independent tasks (impelemnted as SubTask
and attaches each of them to the parent task (in this case MainTask
). This has the effect that when MainTask
ends the code in Main
is still blocked at the Wait
call until all the child tasks have also completed.
Code Example
class Program { static void Main(string[] args) { Task t = Task.Factory.StartNew(MainTask); t.Wait(); Console.WriteLine("Program finished"); Console.ReadLine(); } public static void MainTask() { Console.WriteLine("Starting the Main Task"); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Task.Factory.StartNew(SubTask, TaskCreationOptions.AttachedToParent); Console.WriteLine("Ending the Main Task"); } public static void SubTask() { Console.WriteLine("Starting SubTask {0}", Task.CurrentId); Thread.Sleep(2500); Console.WriteLine("Ending SubTask {0}", Task.CurrentId); } }
Output
Starting the Main Task Ending the Main Task Starting SubTask 1 Starting SubTask 2 Starting SubTask 3 Starting SubTask 4 Starting SubTask 5 Starting SubTask 6 Ending SubTask 2 Starting SubTask 7 Ending SubTask 1 Starting SubTask 8 Ending SubTask 3 Starting SubTask 9 Ending SubTask 4 Starting SubTask 10 Ending SubTask 5 Ending SubTask 6 Ending SubTask 7 Ending SubTask 8 Ending SubTask 9 Ending SubTask 10 Program finished
See also
I have also writtent a blog post on Tasks that create more work which may give further insight into this area.
Filed under: Parallelisation Talk Examples, Parallelization Talk Examples, Talk Examples Tagged: .NET, C#, Parallel.Invoke. Task.Factory.StartNew, parallelisation, parallelization, TaskCreationOptions.AttachedToParent
