这是其中一件事,一旦你这样做,就会更容易理解。
对于生产者消费者,让我们有两个对象,生产者和消费者。它们都共享一个在构造时给定的队列,因此它们可以在它之间进行写入。
添加生产者消费者非常熟悉,只是与 CompleteAdding 有点不同:
public class Producer{
private BlockingCollection<string> _queue;
public Producer(BlockingCollection<string> queue){_queue = queue;}
//a method to do something
public MakeStuff()
{
for(var i=0;i<Int.MaxValue;i++)
{
_queue.Add("a string!");
}
_queue.CompleteAdding();
}
}
消费者似乎没有意义 - 直到您意识到 foreach 不会停止循环,直到队列完成添加。在那之前,如果没有物品,它就会重新进入睡眠状态。而且由于它是生产者和消费者中集合的同一个实例,因此您可以让消费者仅在有实际事情要做时才占用周期,而不必担心停止它、重新启动它等。
public class Consumer()
{
private BlockingCollection<string> _queue;
public Consumer(BlockingCollection<string> queue)
{
_queue = queue;
}
public void WriteStuffToFile()
{
//we'll hold until our queue is done. If we get stuff in the queue, we'll start processing it then
foreach(var s in _queue.GetConsumingEnumerable())
{
WriteToFile(s);
}
}
}
因此,您可以使用集合将它们连接在一起。
var queue = new BlockingCollection<string>();
var producer = new Producer(queue);
var consumer = new Consumer(queue);
producer.MakeStuff();
consumer.WriteStuffToFile();