Producer Consumer Separate 类 with common BlockingCollection
Producer Consumer Separate Classes with common BlockingCollection
希望有人可以就 Producer/Consumer 模式给出一些建议 – 特别是关于如何最好地实现 Queue/BlockingCollection 对所有 COMMON 47=] class 个实例?
让我们简化场景;考虑一下我有;
- 一个生产者class
- 一个消费者class。
- 一项服务
Class 其中包含生产者和消费者的实例
Class。服务 Class 只是告诉 Producer/Consumer 开始
并停止工作。
生产者将填充 BlockingCollection
消费者需要从同一个 BlockingCollection 中读取数据
正如本文所展示的,这一切都非常容易做到;
https://msdn.microsoft.com/en-us/library/dd287186.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2
这个例子本质上在同一个 class 中有 PRODUCER 和 CONSUMER,引用 Common Queue/BlockingCollection 当然是微不足道的,因为对对象的引用是对同一个[中的私有成员的引用=52=].
如果我将 Producer 和 Consumer 分开 Classes,那么这就提出了如何拥有一个公共 BlockingCollection 的问题。
我是否应该将 "Service Class" 设为 Static/Shared Class,在此 class 中创建 BlockingCollection 并将其公开为 friend/public 成员?
common Queue应该放在哪里?
提前致谢!
只需将 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.
}
}
希望有人可以就 Producer/Consumer 模式给出一些建议 – 特别是关于如何最好地实现 Queue/BlockingCollection 对所有 COMMON 47=] class 个实例?
让我们简化场景;考虑一下我有;
- 一个生产者class
- 一个消费者class。
- 一项服务 Class 其中包含生产者和消费者的实例 Class。服务 Class 只是告诉 Producer/Consumer 开始 并停止工作。
生产者将填充 BlockingCollection
消费者需要从同一个 BlockingCollection 中读取数据
正如本文所展示的,这一切都非常容易做到;
https://msdn.microsoft.com/en-us/library/dd287186.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2
这个例子本质上在同一个 class 中有 PRODUCER 和 CONSUMER,引用 Common Queue/BlockingCollection 当然是微不足道的,因为对对象的引用是对同一个[中的私有成员的引用=52=].
如果我将 Producer 和 Consumer 分开 Classes,那么这就提出了如何拥有一个公共 BlockingCollection 的问题。
我是否应该将 "Service Class" 设为 Static/Shared Class,在此 class 中创建 BlockingCollection 并将其公开为 friend/public 成员?
common Queue应该放在哪里?
提前致谢!
只需将 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.
}
}