具有公共BlockingCollection的生产者消费者独立类

时间:2015-06-12 13:18:54

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

希望有人可以提供有关生产者/消费者模式的一些建议 - 特别是如何最好地为所有生产者/消费者类实例实现 COMMON 的Queue / BlockingCollection?

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

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

制作人将填充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并将其公开为朋友/公共成员?

我应该把公共队列放在哪里?

提前致谢!

1 个答案:

答案 0 :(得分:3)

只需将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.
    }
}