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: }
댓글
댓글 쓰기