希望有人可以提供有关生产者/消费者模式的一些建议 - 特别是如何最好地为所有生产者/消费者类实例实现 COMMON 的Queue / BlockingCollection?
让我们简化一下场景;考虑一下;
制作人将填充BlockingCollection
消费者需要从同一个BlockingCollection中读取
这很容易做到,如本文所示;
https://msdn.microsoft.com/en-us/library/dd287186.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2
此示例基本上具有同一类中的PRODUCER和CONSUMER,引用Common Queue / BlockingCollection当然是微不足道的,因为对象的引用是指同一类中的私有成员。
如果我将Producer和Consumer分成不同的类,那么这就提出了如何使用公共BlockingCollection的问题。
我应该制作"服务类"静态/共享类,在此类中创建BlockingCollection并将其公开为朋友/公共成员?
我应该把公共队列放在哪里?
提前致谢!
答案 0 :(得分:3)
只需将Producer
和Consumer
类设计为接受BlockingCollection
作为构造函数参数。
然后,无论您在何处实例化这些类,甚至可能多于每个类,只需确保将BlockingCollection
的同一实例传递给所有生产者和使用者。一旦你完成了这个,就没有必要保留BlockingCollection
的其他外部引用,除非你需要它用于其他东西。每个Producer
和Consumer
都拥有对同一个BlockingCollection
实例的私有引用就足够了。
基本上,它看起来像这样:
public class Producer {
private BlockingCollection queue;
public Producer(BlockingCollection queue) {
this.queue = queue;
}
// more code...
}
public class Consumer {
private BlockingCollection queue;
public Consumer(BlockingCollection queue) {
this.queue = queue;
}
// more code...
}
// The exact design of this class is up to you. This is just an example.
public class ProducerConsumerBuilder {
public void BuildProducerAndConsumer(out Producer producer, out Consumer consumer) {
BlockingCollection queue = new BlockingCollection();
producer = new Producer(queue);
consumer = new Consumer(queue);
// No need to save a reference to "queue" here any longer,
// unless you need it for something else.
// It's enough that the producer and consumer each
// hold their own private reference to the same queue.
}
}