2009-07-17 5 views
4

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

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

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

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

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

(Would, имеющее множество рабочего потока, чтобы IsBackground = true разницы?)

+0

Я думаю, что Thread.IsBackground = true does позволяет завершить процесс, даже если поток все еще работает. –

ответ

4

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

private AutoResetEvent _EmptyEvent = new AutoResetEvent(false); 

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

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

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

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

+0

Вау ... Я должен был подумать об этом. Я только что присоединился к рабочему потоку после вызова метода Close() и poof ... perfect. –

+0

Ницца. Рад, что сработало. –