在不消耗

时间:2015-06-19 16:32:50

标签: c# multithreading concurrency producer-consumer blockingcollection

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

这会唤醒所有等待的线程,但我怎样才能将其重新关闭?

1 个答案:

答案 0 :(得分:4)

如果您最终使用我的评论

将一个虚拟物品放入唤醒生产者的集合中