【问题标题】:Producer Consumer Separate Classes with common BlockingCollection生产者消费者使用公共 BlockingCollection 分离的类
【发布时间】:2015-06-12 13:18:54
【问题描述】:

希望有人可以就生产者/消费者模式提供一些建议——特别是关于如何最好地实现对所有生产者/消费者类实例通用的队列/BlockingCollection?

让我们简化场景;考虑一下我有;

  • 单个生产者类
  • 单个消费者类。
  • 一项服务 包含生产者和消费者实例的类 班级。服务类只是告诉生产者/消费者开始 并停止工作。

生产者将填充 BlockingCollection

消费者需要从同一个 BlockingCollection 中读取数据

正如本文所演示的,这一切都很容易做到;

https://msdn.microsoft.com/en-us/library/dd287186.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

这个例子本质上是同一个类中的生产者和消费者,引用一个公共队列/阻塞集合当然是微不足道的,因为对对象的引用是同一个类中的一个私有成员。

如果我将生产者和消费者分成不同的类,那么这就提出了如何拥有一个通用的 BlockingCollection 的问题。

我是否应该将“服务类”设为静态/共享类,在此类中创建 BlockingCollection 并将其公开为朋友/公共成员?

common Queue应该放在哪里?

提前致谢!

【问题讨论】:

  • 我建议有一个单独的类来封装阻塞集合,另一个控制器类将生产者、消费者和封装的阻塞集合连接在一起。

标签: c# .net vb.net producer-consumer blockingcollection


【解决方案1】:

只需设计您的 ProducerConsumer 类以接受 BlockingCollection 作为构造函数参数。

然后,无论您在何处实例化这些类,甚至每个实例不止一个,只要确保将BlockingCollection 的同一个实例传递给所有生产者和消费者。完成此操作后,无需保留对BlockingCollection 的其他外部引用,除非您需要它用于其他用途。每个ProducerConsumer 都拥有对同一个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.
    }
}

【讨论】:

  • 非常感谢....当然只是传递对象byref,一切都很好:)。已接受答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多