다음을 통해 공유


BackgroundWorker 구성 요소 개요

업데이트: 2007년 11월

일반적으로 수행하는 많은 작업 중에는 실행하는 데 오랜 시간이 걸리는 경우가 많습니다. 예를 들면 다음과 같습니다.

  • 이미지 다운로드

  • 웹 서비스 호출

  • 파일 다운로드 및 업로드(피어-투-피어 응용 프로그램에 대한 다운로드 및 업로드 포함)

  • 복잡한 로컬 계산

  • 데이터베이스 트랜잭션

  • 로컬 디스크 액세스(메모리 액세스에 비해 상대적으로 속도가 느림)

이러한 작업을 실행하는 동안에는 사용자 인터페이스가 응답하지 않을 수 있습니다. 이러한 작업으로 인한 지연이 길어져 UI가 응답을 하지 않는 경우 BackgroundWorker 구성 요소를 사용하여 이러한 문제를 쉽게 해결할 수 있습니다.

BackgroundWorker 구성 요소를 사용하면 응용 프로그램의 주 UI 스레드와 다른 스레드에서 시간이 많이 소모되는 작업을 "백그라운드"에서 비동기적으로 실행할 수 있습니다. BackgroundWorker를 사용하려면 백그라운드에서 실행할 시간이 많이 소모되는 작업자 메서드를 지정한 다음 RunWorkerAsync 메서드를 호출합니다. 작업자 메서드가 비동기적으로 실행되는 동안에도 호출 스레드는 계속 정상적으로 실행됩니다. 메서드가 완료되면 BackgroundWorkerRunWorkerCompleted 이벤트를 발생시켜 호출 스레드에 알립니다. 이 이벤트에는 선택적으로 작업 결과를 포함시킬 수 있습니다.

도구 상자의 구성 요소 탭에서 BackgroundWorker 구성 요소를 사용할 수 있습니다. 폼에 BackgroundWorker를 추가하려면 BackgroundWorker 구성 요소를 폼으로 끕니다. 그러면 구성 요소 트레이에 해당 구성 요소가 나타나며 속성 창에 해당 속성이 나타납니다.

비동기 작업을 시작하려면 RunWorkerAsync 메서드를 사용합니다. RunWorkerAsync는 작업자 메서드에 인수를 전달하는 데 사용할 수 있는 선택적 object 매개 변수를 사용합니다. BackgroundWorker 클래스는 DoWork 이벤트를 노출하며 작업자 스레드는 DoWork 이벤트 처리기를 통해 이 이벤트에 연결됩니다.

DoWork 이벤트 처리기는 Argument 속성을 포함하는 DoWorkEventArgs 매개 변수를 사용합니다. 이 속성은 RunWorkerAsync에서 매개 변수를 받으며 DoWork 이벤트 처리기에서 호출될 작업자 메서드에 전달될 수 있습니다. 다음 예제에서는 ComputeFibonacci라는 작업자 메서드의 결과를 할당하는 방법을 보여 줍니다. 이 예제는 보다 큰 예제에서 발췌한 것으로 방법: 백그라운드 작업을 사용하는 폼 구현에서 전문을 찾아볼 수 있습니다.

' This event handler is where the actual work is done.
Private Sub backgroundWorker1_DoWork( _
ByVal sender As Object, _
ByVal e As DoWorkEventArgs) _
Handles backgroundWorker1.DoWork

    ' Get the BackgroundWorker object that raised this event.
    Dim worker As BackgroundWorker = _
        CType(sender, BackgroundWorker)

    ' Assign the result of the computation
    ' to the Result property of the DoWorkEventArgs
    ' object. This is will be available to the 
    ' RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci(e.Argument, worker, e)
End Sub 'backgroundWorker1_DoWork
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(object sender, 
    DoWorkEventArgs e)
{   
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = sender as BackgroundWorker;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the 
    // RunWorkerCompleted eventhandler.
    e.Result = ComputeFibonacci((int)e.Argument, worker, e);
}
// This event handler is where the actual,
// potentially time-consuming work is done.
void backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
{
   // Get the BackgroundWorker that raised this event.
   BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);

   // Assign the result of the computation
   // to the Result property of the DoWorkEventArgs
   // object. This is will be available to the 
   // RunWorkerCompleted eventhandler.
   e->Result = ComputeFibonacci( safe_cast<Int32>(e->Argument), worker, e );
}
// This event handler is where the actual,
// potentially time-consuming work is done.
private void backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e)
{
    // Get the BackgroundWorker that raised this event.
    BackgroundWorker worker = (BackgroundWorker)sender;

    // Assign the result of the computation
    // to the Result property of the DoWorkEventArgs
    // object. This is will be available to the 
    // RunWorkerCompleted eventhandler.
    e.set_Result(new Long(ComputeFibonacci(System.Convert.ToInt32
        (e.get_Argument()), worker, e)));
    //e.Result = ComputeFibonacci((int)e.Argument, worker, e); 
} //backgroundWorker1_DoWork

이벤트 처리기를 사용하는 방법에 대한 자세한 내용은 이벤트 및 대리자를 참조하십시오.

주의:

다중 스레딩을 사용하는 경우 매우 심각하고 복잡한 버그에 노출될 가능성이 있습니다. 다중 스레딩을 사용하는 솔루션을 구현하기 전에 관리되는 스레딩을 구현하는 최선의 방법을 참조하십시오.

BackgroundWorker 클래스 사용에 대한 자세한 내용은 방법: 백그라운드에서 작업 실행을 참조하십시오.

참고 항목

작업

방법: 백그라운드 작업을 사용하는 폼 구현

기타 리소스

Visual Basic의 다중 스레딩