BlockingCollection
类实现了 IProducerConsumerCollection接口,非常适合您的要求。
您可以创建两个任务,一个用于异步生产者,另一个作为消费者工作者。前者将添加项目,BlockingCollection
而后者只是在新的以 FIFO 顺序可用时立即消耗。
class ProducerConsumer
{
private static BlockingCollection<string> queue = new BlockingCollection<string>();
static void Main(string[] args)
{
Start();
}
public static void Start()
{
var producerWorker = Task.Factory.StartNew(() => RunProducer());
var consumerWorker = Task.Factory.StartNew(() => RunConsumer());
Task.WaitAll(producerWorker, consumerWorker);
}
private static void RunProducer()
{
int itemsCount = 100;
while (itemsCount-- > 0)
{
queue.Add(itemsCount + " - " + Guid.NewGuid().ToString());
Thread.Sleep(250);
}
}
private static void RunConsumer()
{
foreach (var item in queue.GetConsumingEnumerable())
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.ffff") + " | " + item);
}
}
}
IProducerConsumerCollection:
定义用于操作用于生产者/消费者使用的线程安全集合的方法。该接口为生产者/消费者集合提供了统一的表示,以便更高级别的抽象如 System.Collections.Concurrent.BlockingCollection(Of T) 可以将集合用作底层存储机制。