如何在队列中的新项目时出列队列

时间:2014-06-05 16:01:11

标签: c# .net queue

我的应用程序适用于带有字符串的队列(对应于应用程序需要执行的不同任务)。在随机的时刻,队列可以填充字符串(有时候每分钟几次,但也可能需要几个小时。

直到现在我总是有一个计时器,每隔几秒检查队列中是否有队列中的项目并将其删除。

我认为必须有一种比这种方式更好的解决方案。有什么方法可以在项目添加到队列时获得事件吗?

3 个答案:

答案 0 :(得分:5)

是。看看TPL Dataflow,特别是BufferBlock<T>,它与BlockingCollection大致相同,没有通过利用{{1}来阻塞线程的令人讨厌的副作用}。

所以你可以:

async/await

答案 1 :(得分:2)

我会看一下BlockingCollection.GetConsumingEnumerable。默认情况下,该集合将使用队列进行备份,这是一种在使用简单的foreach循环添加队列时自动从队列中获取值的好方法。

还有overload允许您提供CancellationToken,这意味着您可以干净地突破。

答案 2 :(得分:1)

你看过BlockingCollection了吗? GetConsumingEnumerable()方法允许在消费者上运行无限循环,一旦项目可用就会产生新项目,而不需要计时器,或Thread.Sleep's

// Common:

  BlockingCollection<string> _blockingCollection =
                     new BlockingCollection<string>();

//制片人

 for (var i = 0; i < 100; i++) 
 {
    _blockingCollection.Add(i.ToString());
    Thread.Sleep(500); // So you can track the consumer synchronization. Remove.
 }

//消费者:

   foreach (var item in _blockingCollection.GetConsumingEnumerable())
   {
      Debug.WriteLine(item);
   }