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);
}
}