消费者线程和多个生产者线程将其工作与System.Collections.Concurrent.BlockingCollection<T>
同步。
制片人致电blockingCollection.Add()
并且消费者运行
foreach (var item in blockingCollection.GetConsumingEnumerable()) {...}
现在一个生产者想要“刷新”缓冲区:生产者想要等到所有当前项目都被消耗掉。其他生产者可能会在此期间添加更多项目,但此生产者只对当前在队列中的项目感兴趣。
如何让生产者等待,而不是忙着等待?
本质上我想要一些非消费者线程在消耗BlockingCollection的项目时得到通知。
我可以在使用者中设置一个AutoResetEvent,但这只会唤醒一个等待更改的线程,当可能有多个时:
foreach (var item in blockingCollection.GetConsumingEnumerable())
{
myAutoResetEvent.Set()
}
我也可以设置ManualResetEvent:
foreach (var item in blockingCollection.GetConsumingEnumerable())
{
myManualResetEvent.Set()
}
这会唤醒所有等待的线程,但我怎样才能将其重新关闭?
答案 0 :(得分:4)
如果您最终使用我的评论
将一个虚拟物品放入唤醒生产者的集合中