Рассмотрим гипотетический метод объекта, который делает вещи для вас:
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);
Это не это, то есть не то, что я делаю, и это не то, что здесь спрашивают. Если бы это было так, не было бы смысла использовать фонового работника.