2018년 1월 29일 월요일

[WPF 강좌] Background Worker를 이용한 WPF 멀티쓰레드 프로그래밍


[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정 from 탑크리에듀(구로디지털단지역3번출구 2분거리)

1.5.2 Background Worker를 이용한 WPF 멀티쓰레드 프로그래밍
n  Windows 응용 프로그램 멀티 쓰레딩에서 가장 어려운 개념은 다른 스레드에서 UI를 변경할 수 없다는 것이다대신 UI스레드에서 메소드를 호출해야 원하는 변경이 이루어 진다.
n  백그라운드 워커(Background Worker)는 System.ComponentModel 아래의 클래스로 코드를 별도의 쓰레드에서 동시에 비동기적으로 실행하게 해 주는데 응용프로그램의 기본 쓰레드와 자동으로 동기화 해준다호출 쓰레드는 정상적으로 실행이 되고 Background Worker는 백그라운드에서 비동기적으로 실행된다.
n  백그라운드에서 작업을 실행하고 UI 실행등을 연기하는데 사용되는데 사용자는 UI가 계속 반응하기를 원하면서 데이터를 다운로드 한다든지,  오래 걸리는 작업이 있어 진행사항을 표시해야 되는 경우데이터베이스 트랜잭션 처리 등에 유용하다.
n  Background Worker에서 일어나는 작업에 대해 변경이 생길 때 호출되는 ProcessedChanged 이벤트작업이 완료되었을 때 무언가를 할 수 있도록 지원하는 RunWorkerCompledted 이벤트가 발생한다.
n  DoWork 이벤트에서 백그라운드 쓰레드가 할일을 기술하는데 DoWork 이벤트 처리 메소드 내용은 다른 백그라운드 다른 쓰레드에서 처리되므로 UI쪽을 접근할 수 없는데 ReportProgress() 메소드를 호출하면 ProcessChanged 이벤트가 발생하여 UI를 업데이트하는 것이 가능하다.
n  ProgressChanged  RunWorkerCompleted 이벤트는 BackgroundWorker가 만들어지는 것과 동일한 스레드에서 실행된다.
n  BackgroundWorker는 일반적으로 기본/UI 쓰레드이므로 UI를 업데이트 할 수 있다따라서 실행중인 백그라운드 작업과 UI간에 수행 할 수있는 유일한 통신방법은 ReportProgress() 메서드를 사용하는 것이다.
n  DoWork 이벤트 처리 메소드 내부에서 파라미터가 필요하면 백그라운드 워커를 호출하는 RunWorkerAsync() 메소드의 인수로 넣어주면 된다.
int count = (int)e.Argument;
n  DoWork 이벤트 처리 메소드 내부에서 e.Result 등으로 어떤 결과값을 넣어두면 RunWorkerCompledted 이벤트 처리 메소드에서 e.Result 형태로 꺼내볼 수 있다.

댓글 없음:

댓글 쓰기