考虑一个 为您做事的对象假设方法:
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);
这是不是它,那是不是我在做什么,那就是没有什么被要求在这里。如果真是这样,那么使用后台工作人员将毫无意义。