BackgroundWorker 클래스는 주스레드에서 작업자 스레드에게 어떤 일을 맡기면서
프로그래스바를 이용하여 사용자에게 진행 상태를 알려주도록 하는 일이 필요한 경우에 보통 많이 사용된다.
보통 워커 스레드라도고 하며 이 클래스의 메커니즘은 아래와 같다.
// BackgroundWorker 객체 생성
BackgroundWorker worker = new BackgroundWorker();
// 백그라운드에서 처리할 작업 스레드 핸들러 등록
worker.DoWoker += new DoWorkEventHandler(worker_DoWork);
// ReportProgress( )호출시 진행 상태를 업데이트하는 핸들러
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
// 완료시 처리 작업을 담당하는 스레드 핸들러 등록
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync(); // 작업 스타트
그림으로 실제 작업 시퀀스를 살펴보면 아래와 같다.
각 이벤트 핸들러(처리기)에서 담당하는 역할은
work_DoWork에서 작업을 처리하면서 작업 진도가 올라갈 때마다 ReportProgress( ) 함수를 호출해 준다. 이때 매개변수로 작업 진도를 나타내는 값을 전달한다.(percent)
work_ProgressChanged에서는 work_DoWork에서 전달한 작업 진도 값을 ProgressBar 객체로 전달하여 사용자에게 작업 상태를 보여준다.
최종적으로 작업이 완료되면 worker_RunWorkerCompleted가 호출되어 작업이 완료되었음을 사용자에게 전달하거나 완료 시 처리해야 할 작업들을 수행하게 된다.
직접 작업자 스레드를 생성하여 일을 시킬 수도 있지만
작업 진도를 사용자에게 전달하는 메커니즘이 필요하다면 BackgroundWorker 클래스를 이용하는 것이 훨씬 작업의 수고를 줄여 줄 수 있다.
참고로 work_DoWork 이벤트 처리기는 작업자 스레드에서 처리되고
work_ProgressChanged와 worker_RunWorkerComplet는 UI 스레드에서 처리된다.
또한 BackgroundWorker 클래스의 worker 객체는 Thread Pool로부터 가져온 스레드를 사용한다는 점도 알아두면 도움이 될 수 있다.
'프로그래밍' 카테고리의 다른 글
프로세스간 메시지 전송[1] (2) | 2020.05.05 |
---|---|
화면녹화 프로그램 만들기[1] (2) | 2020.05.04 |
화면녹화 프로그램 만들기[0] (1) | 2020.05.03 |
프로세스간 메시지 전송[0] (0) | 2020.04.30 |
재귀호출로 하위 항목(디렉토리) 접근 (4) | 2020.04.27 |
댓글