Как ждать отмены BackgroundWorker?
Рассмотримhypothetical метод объекта, который делает вещи для вас:
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 не является повторным входом).
Я хотел бы использовать какое-либо решение, включающее объекты синхронизации событий, где кодwaits на событие - это работникRunWorkerCompleted
наборы обработчиков событий. Что-то вроде:
Event _workerDoneEvent = new WaitHandle();
public void CancelDoingStuff()
{
_worker.CancelAsync();
_workerDoneEvent.WaitOne();
}
private void RunWorkerCompletedEventHandler(sender object, RunWorkerCompletedEventArgs e)
{
_workerDoneEvent.SetEvent();
}
Но я возвращаюсь в тупик: обработчик событий не может работать до тех пор, пока приложение не будет бездействующим, и приложение не будет бездействовать, потому что оно ожидает события.
Так как же вы можете дождаться окончания работы BackgroundWorker?
Update Люди, кажется, смущены этим вопросом. Кажется, они думают, что я буду использовать BackgroundWorker как:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += MyWork;
worker.RunWorkerAsync();
WaitForWorkerToFinish(worker);
То естьnot это, то естьnot что я делаю, и этоnot что здесь спрашивают. Если бы это было так, не было бы смысла использовать фонового работника.