一个使用者线程和多个生产者线程将其工作与System.Collections.Concurrent.BlockingCollection<T>
同步。
制片人称blockingCollection.Add()
和消费者运行
foreach (var item in blockingCollection.GetConsumingEnumerable()) {...}
现在,一个生产者想要"刷新"缓冲区:生产者想要等到所有当前项目都被消耗殆尽。其他生产者可能会同时添加更多项目,但此生产者只对当前在队列中的项目感兴趣。
如何让生产者等待,而不使用繁忙的等待?
从本质上讲,我希望一些非使用者线程在消耗 BlockingCollection 的项目时收到通知。
我可以在使用者中设置自动重置事件,但这只会唤醒一个线程等待更改,而可能有多个线程:
foreach (var item in blockingCollection.GetConsumingEnumerable())
{
myAutoResetEvent.Set()
}
我还可以设置手动重置事件:
foreach (var item in blockingCollection.GetConsumingEnumerable())
{
myManualResetEvent.Set()
}
这将唤醒所有等待的线程,但我如何再次将其关闭?
如果您最终使用我的评论
在集合中放置一个唤醒生产者的虚拟项