C# – BackgroundWorker

By | 2023년 11월 9일
Table of Contents

C# – BackgroundWorker

BackgroundWorker 는 이름 그대로 백그라운드에서 작업해야 할 프로세스를 실행해줍니다.
한가지 더 좋은 점은 간간히 UI 에 접근해 값을 가져오거나 값을 수정해 줄 수 있습니다.

또한, progress bar 를 업데이트 해주는 기능도 있습니다.

생성

private BackgroundWorker create_wav_and_play_worker = new BackgroundWorker();

/// ...

create_wav_and_play_worker.WorkerSupportsCancellation = true;
create_wav_and_play_worker.DoWork += new DoWorkEventHandler(create_wav_and_play_DoWork);
create_wav_and_play_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(create_wav_and_play_RunWorkerCompleted);

// ...

create_wav_and_play_worker.RunWorkerAsync();

DoWork

UI 에 접근하기 위해서는 Dispatcher 를 사용해야 합니다.
아니면 아래와 같은 오류가 발생할 수 있습니다.

다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다.

private void create_wav_and_play_DoWork(object sender, DoWorkEventArgs e)
{
    Thread.Sleep(100);
    // ......
    Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate {
        vlinecenter = XXXX.VlineCenter;
        tp = (DataContext as XXXXViewModel).SelectType;
    }));
}

RunWorkerCompleted

프로세스 완료시의 함수도 생성해 줍니다.
생성하지 않으면 예외가 발생해 BackgroundWorker 가 갑자기 종료해도 아무런 오류 메시지를 받을 수 없습니다.

void create_wav_and_play_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error == null)
    {
        //Worker completed successfully
    }
    else
    {
        CommonMessageBox.BasicMessageBox(e.Error.Message);
    }
}

답글 남기기