당신을 위해 물건을 만드는 가상의 방법을 고려하십시오 :
public class DoesStuff
{
BackgroundWorker _worker = new BackgroundWorker();
...
public void CancelDoingStuff()
{
_worker.CancelAsync();
//todo: Figure out a way to wait for BackgroundWorker to be cancelled.
}
}
BackgroundWorker가 완료 될 때까지 어떻게 기다릴 수 있습니까?
과거에는 사람들이 시도했습니다 :
while (_worker.IsBusy)
{
Sleep(100);
}
그러나 이 교착 상태 때문에 IsBusy
때까지 해제되지 않은 RunWorkerCompleted
이벤트가 처리되며, 응용 프로그램이 유휴 상태가 될 때까지 해당 이벤트가 처리되지 수 있습니다. 작업자가 완료 될 때까지 응용 프로그램이 유휴 상태가되지 않습니다. (또한, 그것은 바쁜 루프입니다-역겨운.)
다른 사람들은 그것을 제안하는 것을 제안했습니다.
while (_worker.IsBusy)
{
Application.DoEvents();
}
문제는 Application.DoEvents()
현재 큐에있는 메시지를 처리하여 재진입 문제를 일으킨다는 것입니다 (.NET은 재진입 할 수 없음).
코드 가 이벤트를 기다리는 이벤트 동기화 객체와 관련된 솔루션을 사용 하려고합니다. 워커의 RunWorkerCompleted
이벤트 핸들러가 설정합니다. 다음과 같은 것 :
Event _workerDoneEvent = new WaitHandle();
public void CancelDoingStuff()
{
_worker.CancelAsync();
_workerDoneEvent.WaitOne();
}
private void RunWorkerCompletedEventHandler(sender object, RunWorkerCompletedEventArgs e)
{
_workerDoneEvent.SetEvent();
}
그러나 교착 상태로 돌아 왔습니다. 응용 프로그램이 유휴 상태가 될 때까지 이벤트 처리기를 실행할 수 없으며 응용 프로그램이 이벤트를 대기 중이기 때문에 유휴 상태가 아닙니다.
그러면 BackgroundWorker가 완료 될 때까지 어떻게 기다릴 수 있습니까?
업데이트 사람들은이 질문에 의해 혼동 될 것으로 보인다. 그들은 내가 BackgroundWorker를 다음과 같이 사용할 것이라고 생각하는 것 같습니다.
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += MyWork;
worker.RunWorkerAsync();
WaitForWorkerToFinish(worker);
즉 없습니다 입니다, 그것을 하지 내가 뭘하는지, 그리고는 하지 여기에 요구되는 내용. 이 경우에는 백그라운드 작업자를 사용할 필요가 없습니다.