我需要单生成器,单用户FIFO查询,因为
所以它非常像我认为的TCP / IP,你有一个生产者和一个消费者,有时你可以比你可以处理的更快地接收消息,所以你必须查询它们。订单很重要,而且来电者对你用这些东西完全不感兴趣。
这听起来很容易,我可能会使用通用Queue
,但我想使用BlockingCollection
,因为我不想用ManualResetEvent
等编写任何代码
我的任务有多适合BlockingCollection
,可能你可以提出别的建议吗?
答案 0 :(得分:11)
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);
}
}
}
定义操作用于的线程安全集合的方法 生产者/消费者使用。这个界面提供了统一的 生产者/消费者集合的代表性,以便更高级别 抽象如 System.Collections.Concurrent.BlockingCollection(Of T)可以使用 集合作为底层存储机制。
答案 1 :(得分:0)
既然你需要一个队列,为什么不坚持队列呢?您可以使用Syncrhonized Queue。