11월, 2018의 게시물 표시

[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: c...

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

Task 수행 중에 Wait 메서드를 호출하거나 Result 속성을 살펴보게 되면 거의 항상 스레드 풀 내에 새로운 스레드가 생기게 되어 리소스를 많이 사용하게 되고 성능에 좋지 않은 영향을 미치게 된다. Wait 메서드나 Result 속성보다 Task가 언제 수행 완료하였는지를 확인할 수 있는 좋은 방법이 있는데, ContinueWith 메소드를 이용해 Task가 완료되었을 때 다른 Task를 수행하게 하는 방법이다. CancellationTokenSource와 Task를 생성 1: CancellationTokenSource cts = new CancellationTokenSource(); 2: Task<Int32> t = Task.Run<Int32>(() => Sum(cts.Token, 10000), cts.Token); Task 성공, 예외 발생, 취소 후 수행할 Task를 등록 1: // 작업이 성공했을 경우 실행 2: t.ContinueWith(task => Console.Write("The sum is: " + task.Result), TaskContinuationOptions.OnlyOnRanToCompletion); 3: // 작업에 예외가 발생했을 경우 실행 4: t.ContinueWith(task => { 5: foreach (var e in task.Exception.InnerExceptions) 6: { 7: if (e is OperationCanceledException) Console.WriteLine("Sum was canceled"); 8: else Console.WriteLine("Sum threw: " + task.Exception); 9: } 10: ...

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

Task를 이용하면 Task가 완료될 때까지 대기 하였다가 결과를 얻는 것이 가능하다. 1: private static void TaskWaitSample() 2: { 3: // 태스크를 생성한다.(아직 시작하지 않았다) 4: Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 10000); 5: 6: // 태스크를 수행 7: t.Start(); 8: 9: // 필요하다면 태스크가 완료될 때까지 명시적으로 대기할 수 있다. 10: // Wait()를 호출한 쓰레드가 블러킹된다. 11: t.Wait(); // 참고: 타임아웃 시간이나 CancellationToken을 매개변수로 취하는 메서드도 있음. 12: 13: // 결과를 얻어온다 14: Console.WriteLine("The Sum is: " + t.Result); 15: } 16: 17: private static Int32 Sum(Int32 n) 18: { 19: Int32 sum = 0; 20: for(; n > 0; n--) 21: { 22: checked { sum += n; } 23: } 24: 25: return sum; 26: } Task 수행 중 예외 발생 Task가 수행 중에 처리되지 않은 예외를 유발하는 경우, 바로 예외가 발생하지 않고 특정 컬렉션에 예외를 저장 한 후, 스레드가 스레드 풀로 반납되도록 한다. 이 후 Wait 메서드를 호출하거나 Result 속성 값을 가져오려 하면 그때 System.AggregateException ...

[C#] ThreadPool 작업 취소와 타임아웃 Part 2

이미지
CancellationTokenSource의 Register 메서드를 이용하면 CancellationTokenSource가 취소될 때 수행할 여러 개의 메서드를 미리 등록할 수 있다. 샘플 1: private static void CancelTokenRegisterTest() 2: { 3: CancellationTokenSource cts = new CancellationTokenSource(); 4: cts.Token.Register(() => Console.WriteLine("Canceled 1")); 5: cts.Token.Register(() => Console.WriteLine("Canceled 2")); 6: 7: cts.Cancel(); 8: } 결과 CancellationTokenSource 객체들을 연결하여 새로운 CancellationTokenSource 객체를 생성할 수도 있다. 이렇게 생성된 CancellationTokenSource 객체는 연결된 CancellationTokenSource 객체들 중 하나라도 취소되면 같이 취소 된다. 샘플 1: private static void CancelLinkedTest() 2: { 3: // CancellationTokenSource 생성 4: var cts1 = new CancellationTokenSource(); 5: cts1.Token.Register(() => Console.WriteLine("Canceled 1")); 6: 7: // 다른 CancellationTokenSource 생성 8: var cts2 = new CancellationTokenSource(); 9: ...

[C#] ThreadPool 작업 취소와 타임아웃 Part 1

.NET Framework는 작업 취소를 위한 표준화된 패턴을 제공하고 있는데 이를 협조적 취소 패턴 (Cooperative Cancellation)이라 한다. 장시간 수행되어야 하는 계산 중심 작업은 진행 중인 작업을 취소할 수 있는 기능을 제공하는게 좋다. 취소 패턴을 구현 하려면 두 가지를 사용해야 한다. CancellationTokenSource CancellationToken 1부터 1000까지 반복하는 샘플 코드를 만들어 보자. (취소 테스트를 위해 반복 코드에 시간 지연 코드를 추가 하였다.) CancellationTokenSource 객체를 생성 작업 쓰레드를 생성하면서 CancellationTokenSource 객체 참조 변수를 파라미터로 전달 작업 쓰레드에서 Count 메소드 시작 CancellationTokenSource 객체의 Cancel() 호출 Count() 메서드에서 반복 작업 중 CancellationToken의 IsCancellationRequested 속성이 true 이면 작업 중지 처리 작업 쓰레드 종료 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: 1...