[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

이미지
그룹핑 ListViewItem 그룹핑 할 수 있습니다. 먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다. 1: <!-- Group CheckBox --> 2: <CheckBox Grid.Column="0" 3: Grid.Row="0" 4: Checked="AddGrouping" 5: Unchecked="RemoveGrouping">Group by Name</CheckBox> 그룹 스타일 선언 GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다. 1: <!-- Group Style --> 2: <ListView.GroupStyle> 3: <GroupStyle> 4: <GroupStyle.ContainerStyle> 5: <Style TargetType="{x:Type GroupItem}"> 6: <Setter Property="Margin" Value="0,0,0,5" /> 7: <Setter Property="Te...

[C#] 자식 Task 생성

Task는 부모/자식 관계를 가질 수 있다.

  • 부모 Task를 생성
1:  Task<Int32[]> parent = new Task<Int32[]>  


  • 세 개의 자식 Task 생성
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:      }  


댓글

이 블로그의 인기 게시물

[C#] Task 완료 시 다른 Task를 자동으로 수행

[C#] 태스크(Task)가 완료될 때 까지 대기하여 결과를 얻는 방법

[C#] 명시적으로 Task 생성 및 실행