[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#] ThreadPool 작업 취소와 타임아웃 Part 1


.NET Framework는 작업 취소를 위한 표준화된 패턴을 제공하고 있는데 이를 협조적 취소 패턴(Cooperative Cancellation)이라 한다.

장시간 수행되어야 하는 계산 중심 작업은 진행 중인 작업을 취소할 수 있는 기능을 제공하는게 좋다.

취소 패턴을 구현 하려면 두 가지를 사용해야 한다.


1부터 1000까지 반복하는 샘플 코드를 만들어 보자.
(취소 테스트를 위해 반복 코드에 시간 지연 코드를 추가 하였다.)
  1. CancellationTokenSource 객체를 생성
  2. 작업 쓰레드를 생성하면서 CancellationTokenSource 객체 참조 변수를 파라미터로 전달
  3. 작업 쓰레드에서 Count 메소드 시작
  4. CancellationTokenSource 객체의 Cancel() 호출
  5. Count() 메서드에서 반복 작업 중 CancellationToken의 IsCancellationRequested 속성이 true 이면 작업 중지 처리
  6. 작업 쓰레드 종료

1:  class Program  
2:    {  
3:      static void Main(string[] args)  
4:      {  
5:        CancellationTokenSource cts = new CancellationTokenSource();  
6:    
7:        // CancellationToken과 함께 작업에 필요한 반복 횟수를 전달 하였다.  
8:        ThreadPool.QueueUserWorkItem(o => Count(cts.Token, 1000));  
9:    
10:        Console.WriteLine("Press <Enter> to cancel the operation.");  
11:        Console.ReadLine();  
12:    
13:        // Count 작업이 이미 완료되었다면 취소 요청이 아무런 영향도 미치지 않는다.  
14:        cts.Cancel();  
15:    
16:        Console.ReadLine();  
17:      }  
18:    
19:      private static void Count(CancellationToken token, Int32 countTo)  
20:      {  
21:        for (int i = 0; i < countTo; i++)  
22:        {  
23:          if (token.IsCancellationRequested)  
24:          {  
25:            Console.WriteLine("Count is cancelled");  
26:            break;  
27:          }  
28:    
29:          Console.WriteLine(i);  
30:          Thread.Sleep(200); // 데모를 위해 약간의 시간 지연  
31:        }  
32:    
33:        Console.WriteLine("Count is done");  
34:      }  
35:    }  


  • 참고
    작업을 취소할 수 없게 하려면 CancellationToken의 정적 속성인 None을 매개변수로 전달하면 된다.

댓글

이 블로그의 인기 게시물

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

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

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