对于单一生产者,单一消费者应该使用BlockingCollection还是ConcurrentQueue?

时间:2010-05-26 20:38:02

标签: multithreading concurrency .net-4.0

对于单一生产者,单一消费者应该使用BlockingCollection还是ConcurrentQueue?

关注:

  • 我的目标是一次最多提取100件商品,并将其作为批次发送到下一步。
  • 如果我使用ConcurrentQueue,我必须手动让它在没有工作要做的时候睡着。否则我会在旋转时浪费CPU周期。
  • 如果我使用BlockingQueue并且我只有99个工作项,那么它可以无限期地阻止,直到第100个项目到达为止。

http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx

2 个答案:

答案 0 :(得分:1)

你可能可以使用其中任何一个。虽然你说如果使用ConcurrentQueue,那么你必须在队列为空时执行旋转等待。如果你期望生产者和消费者之间的滞后时间短,那可能并不是那么糟糕。最后,我认为你会发现BlockingCollection对你的场景更加柔韧。它毕竟是生产者 - 消费者模式的首选数据结构。有几种不同的方法可以解决无限期等待问题。

  • 使用sentinel值作为消费者的停止指示符。插入队列的null值在此处可以正常工作。
  • 利用CancellationToken机制取消阻止Take方法。

答案 1 :(得分:-4)