본문 바로가기
프로그래밍

BackgroundWorker 사용 하기

by minimax95 2020. 5. 2.

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로부터 가져온 스레드를 사용한다는 점도 알아두면 도움이 될 수 있다.

 

댓글