흔히 백그라운드 작업이 필요할때 쓰레드를 추가로 만들어서 작업을 하곤 합니다. C#에서도 같은 방식으로 쓰레드를 만들어 추가 작업을 수행할 수 있지만, C#에서는 BackgroundWorker라는 간편한(?) 백그라운드 작업을 위한 기능을 제공해줍니다. 손쉽게 사용할 수 있고, 크로스 쓰레드 Cross-thread 문제를 피하기에도 좋은 방법입니다.
1. 윈폼 디자인 화면에서 BackgroundWorker를 추가하거나 생성합니다.
직접 코드로 이벤트 함수를 생성해주거나 윈폼 속성 창에서 함수 선언을 해줍니다.
참고 : http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx
1. 윈폼 디자인 화면에서 BackgroundWorker를 추가하거나 생성합니다.
또는
// 새로운 BackgroundWorker 생성 BackgroundWorker bw = new BackgroundWorker(); // 중간 취소를 지원할 경우 설정값 bw.WorkerSupportsCancellation = true; // 작업 중간 상태 보고를 지원할 경우 설정값 bw.WorkerReportsProgress = true;2. BackgroundWorker에서는 3가지 이벤트 함수를 지원합니다.
- DoWork 백그라운드에서 작업할 함수
- ProgressChanged 작업 경과 보고나 상태 변화 보고
- RunWorkerCompleted 백그라운드 작업이 완료 되었을 경우 호출
직접 코드로 이벤트 함수를 생성해주거나 윈폼 속성 창에서 함수 선언을 해줍니다.
또는
private void DoBackgroundwork(object sender, DoWorkEventArgs e) { // TODO : 백그라운드로 수행할 작업 for (int i = 1; (i <= 10); i++) { // 작업이 취소 되었을 경우 if ((worker.CancellationPending == true)) { e.Cancel = true; break; } else { // ReportProgress를 통해 작업 진척도를 통보 ( 1~100 퍼센트 ) worker.ReportProgress((i * 10)); } } } private void ProgressChangedBackgroundwork(object sender, ProgressChangedEventArgs e) { // TODO : ProgressBar를 사용할 경우 작업 진행 정도를 표시 해줄수 있다. pbProgressBar.Value = e.ProgressPercentage; } private void CompleteBackgroundwork(object sender, RunWorkerCompletedEventArgs e) { // TODO : 작업 완료 MessageBox.Show("작업이 완료되었습니다.", "확인"); } // 초기화 부분에 BackgroundWorker 생성 후 이벤트 핸들러를 바인딩 해줍니다. bw.DoWork += new DoWorkEventHandler(this.DoBackgroundwork); bw.ProgressChanged += new ProgressChangedEventHandler(this.ProgressChangedBackgroundwork); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.ProgressChangedBackgroundwork);
참고 : http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx