這是其中一件事情,一旦你這樣做就容易理解。
對於生產者消費者,讓我們有兩個對象,生產者和消費者。它們在構建時共享一個隊列,這樣它們就可以在它之間寫入。
添加在一個生產消費是相當熟悉,剛剛與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();
我找不到任何地方 - 「阻塞」是什麼意思,它是「忽略」к「等到」? – Fulproof
「阻塞」意味着「等到操作完成」 – Thilo