【问题标题】:How to wait for a Blocking Queue to be emptied by worker如何等待阻塞队列被工作人员清空
【发布时间】:2009-07-17 23:11:14
【问题描述】:

我正在使用带有阻塞队列的单一生产者-单一消费者模型。我希望生产者在完成生产后等待队列清空后再返回。

我实现了 Marc Gravell 建议的 BlockingQueue here

在我的模型中,生产者(渲染器)使用事件来通知工作器(打印机)何时渲染文件(工作器将项目排队)以及每个文件都被渲染(完成)。

现在,当渲染器完成时,方法结束并且工作人员被杀死,所以我最终得到了 10-15 个尚未打印的渲染文件。

我希望完成的事件处理程序一直阻塞,直到队列被清空,例如,当所有文件都被打印时。我想添加类似“WaitToClose()”的方法,该方法将阻塞直到队列为空。

(将工作线程设置为IsBackground = true 会有所不同吗?)

【问题讨论】:

  • 我认为 Thread.IsBackground = true 所做的是允许进程完成,即使线程仍在运行。

标签: c# queue blocking producer-consumer


【解决方案1】:

如何将事件添加到队列中:

private AutoResetEvent _EmptyEvent = new AutoResetEvent(false);

然后修改Queue为空时设置事件,就可以对事件进行阻塞。

进一步考虑,但是,当队列为空时,打印机仍将打印最后一项。

那么,你可以在工作线程上加入(阻塞)。

更简单的想法:只阻塞工作线程,并在队列为空时让工作线程完成(退出)?

【讨论】:

  • 哇...我应该想到的。在调用 Close() 方法后,我刚刚在工作线程上做了一个 Join 并且噗……完美。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
相关资源
最近更新 更多