在不消耗的情况下观察块集合中的更改



一个使用者线程和多个生产者线程将其工作与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()
}

这将唤醒所有等待的线程,但我如何再次将其关闭?

如果您最终使用我的评论

在集合中放置一个唤醒生产者的虚拟项

相关内容

最新更新