我有一个用 new BlockingCollection
of实现的“单一生产者/单一消费者”场景.NET 4.0
。
问题是一旦集合中有一个空间空闲,生产者线程就会唤醒。我希望生产者阻止,直到消费者消耗至少一半的集合项目。这是因为生产者的速度很高并且生产对系统来说是昂贵的。
如何控制生产者的阻塞条件?
我有一个用 new BlockingCollection
of实现的“单一生产者/单一消费者”场景.NET 4.0
。
问题是一旦集合中有一个空间空闲,生产者线程就会唤醒。我希望生产者阻止,直到消费者消耗至少一半的集合项目。这是因为生产者的速度很高并且生产对系统来说是昂贵的。
如何控制生产者的阻塞条件?
要考虑的一种方法是排队较少的“较大”项目,而不是许多“小”单个项目。
例如,您可以将集合更改为 1,并将项目类型更改为项目列表。这样,您的生产者可以生成一个包含 100 个项目的列表并将其排队,然后消费者将获取此列表并对其进行处理,让生产者开始处理接下来的 100 个项目。这里的关键是生产者将被优化为在一批中生产更大批量的数据,然后才被阻塞等待消费者完成。收集上的颠簸会少得多,但生产和消费仍然会重叠。
当消费者拿到 100 件商品的清单时,实际上是取走了未完成商品的可能总数的一半,即 200 件商品。因此,从概念上讲,这为您提供了阻塞条件。