흔히 백그라운드 작업이 필요할때 쓰레드를 추가로 만들어서 작업을 하곤 합니다. C#에서도 같은 방식으로 쓰레드를 만들어 추가 작업을 수행할 수 있지만, C#에서는 BackgroundWorker라는 간편한(?) 백그라운드 작업을 위한 기능을 제공해줍니다. 손쉽게 사용할 수 있고, 크로스 쓰레드 Cross-thread 문제를 피하기에도 좋은 방법입니다.

 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

+ Recent posts