프로그래밍

BackgroundWorker 사용 하기

minimax95 2020. 5. 2. 09:00

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