考虑一个对象的假设方法,为您做一些事情:
public class DoesStuff
{
BackgroundWorker _worker = new BackgroundWorker();
...
public void CancelDoingStuff()
{
_worker.CancelAsync();
//todo: Figure out a way to wait for BackgroundWorker to be cancelled.
}
}
Run Code Online (Sandbox Code Playgroud)
如何等待BackgroundWorker完成?
在过去,人们尝试过:
while (_worker.IsBusy)
{
Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)
但是这种死锁,因为IsBusy在RunWorkerCompleted事件处理之后才会被清除,并且在应用程序空闲之前无法处理该事件.在工人完成之前,应用程序不会闲置.(另外,这是一个繁忙的循环 - 恶心.)
其他人已添加建议将其融入:
while (_worker.IsBusy)
{
Application.DoEvents();
}
Run Code Online (Sandbox Code Playgroud)
这样做的问题是Application.DoEvents()导致当前队列中的消息被处理,这会导致重入问题(.NET不可重入).
我希望使用一些涉及事件同步对象的解决方案,其中代码等待事件 - 工作者的RunWorkerCompleted事件处理程序设置.就像是:
Event _workerDoneEvent = new WaitHandle();
public void CancelDoingStuff()
{
_worker.CancelAsync();
_workerDoneEvent.WaitOne();
}
private void RunWorkerCompletedEventHandler(sender object, …Run Code Online (Sandbox Code Playgroud)