Как ждать освобождения очереди блокировки работником - PullRequest
4 голосов
/ 18 июля 2009

Я использую модель единственного производителя-потребителя с очередью блокировки. Я хотел бы, чтобы производитель, когда он закончил производство, дождался освобождения очереди, прежде чем вернуться.

Я реализовал BlockingQueue, предложенный здесь Марком Гравеллом.

В моей модели производитель (средство визуализации) использует события для уведомления работника (принтера) о том, когда файл обрабатывается (работник помещает элемент в очередь) и когда каждый файл был обработан (завершен).

Прямо сейчас, когда рендеринг завершен, метод заканчивается, и работник убивается, поэтому я получаю 10-15 отрендеренных файлов, которые не были напечатаны.

Я хочу, чтобы обработчик завершенных событий блокировался до тех пор, пока очередь не будет очищена, например, когда будут распечатаны все файлы. Я хочу добавить что-то вроде метода «WaitToClose ()», который будет блокироваться до тех пор, пока очередь не станет пустой.

(Будет ли изменение рабочего потока на IsBackground = true иметь значение?)

1 Ответ

4 голосов
/ 18 июля 2009

Как насчет добавления события в очередь:

private AutoResetEvent _EmptyEvent = new AutoResetEvent(false);

Затем измените очередь, чтобы установить событие, когда оно пустое, и вы можете заблокировать событие.

Обдумывая это дальше, однако, когда очередь пуста, принтер все равно будет печатать последний элемент.

Итак, вы можете присоединиться (заблокировать) в рабочем потоке.

Более простая идея: просто заблокировать рабочий поток и завершить (завершить) рабочий поток, когда очередь пуста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...