Task는 부모/자식 관계를 가질 수 있다.
1: Task<Int32[]> parent = new Task<Int32[]>
1: // 세 개의 차일드 태스크를 생성하고 수행한다.
2: Task child1 = new Task(() => results[0] = Sum(1000), TaskCreationOptions.AttachedToParent);
3: Task child2 = new Task(() => results[1] = Sum(2000), TaskCreationOptions.AttachedToParent);
4: Task child3 = new Task(() => results[2] = Sum(3000), TaskCreationOptions.AttachedToParent);
5:
6: child1.ContinueWith(task => Console.WriteLine("Child1 completed"), TaskContinuationOptions.OnlyOnRanToCompletion);
7: child2.ContinueWith(task => Console.WriteLine("Child2 completed"), TaskContinuationOptions.OnlyOnRanToCompletion);
8: child3.ContinueWith(task => Console.WriteLine("Child3 completed"), TaskContinuationOptions.OnlyOnRanToCompletion);
9:
10: child1.Start();
11: child2.Start();
12: child3.Start();
- 부모 Task와 자식 Task가 모두 수행을 완료 후 수행하는 작업 추가
1: parent.ContinueWith(parentTask => Array.ForEach(parentTask.Result, Console.WriteLine));
기본적으로 Task가 다른 Task를 생성하게 되면 둘 사이의 연관 관계는 없으며, 새롭게 생성되는 Task는 최상위 레벨의 Task다. 하지만 TaskCreationOptions.AttachedToParent 플랙그를 지정하면 새로운 Task를 자식 Task로 생성할 수 있으며, 자식 Task가 작업을 완료하기 전까지 부모 Task는 작업을 완료하지 않은 것으로 간주된다.
1: private static void CreateChildTask()
2: {
3: Task<Int32[]> parent = new Task<Int32[]>(() =>
4: {
5: var results = new Int32[3]; // 결과를 담기 위한 배열
6:
7: // 세 개의 차일드 태스크를 생성하고 수행한다.
8: Task child1 = new Task(() => results[0] = Sum(1000), TaskCreationOptions.AttachedToParent);
9: Task child2 = new Task(() => results[1] = Sum(2000), TaskCreationOptions.AttachedToParent);
10: Task child3 = new Task(() => results[2] = Sum(3000), TaskCreationOptions.AttachedToParent);
11:
12: child1.ContinueWith(task => Console.WriteLine("Child1 completed"), TaskContinuationOptions.OnlyOnRanToCompletion);
13: child2.ContinueWith(task => Console.WriteLine("Child2 completed"), TaskContinuationOptions.OnlyOnRanToCompletion);
14: child3.ContinueWith(task => Console.WriteLine("Child3 completed"), TaskContinuationOptions.OnlyOnRanToCompletion);
15:
16: child1.Start();
17: child2.Start();
18: child3.Start();
19:
20: return results;
21: });
22:
23: // 부모 태스크와 자식 태스크들이 모두 수행을 완료하면 결과를 출력한다.
24: parent.ContinueWith(parentTask => Array.ForEach(parentTask.Result, Console.WriteLine));
25:
26: // 부모 태스크를 수행하여 자식 태스크들이 수행될 수 있도록 한다.
27: parent.Start();
28: }
댓글
댓글 쓰기