Как ждать отмены 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 что здесь спрашивают. Если бы это было так, не было бы смысла использовать фонового работника.

Ответы на вопрос(17)

Ваш ответ на вопрос