快速和最佳生产者/消费者队列技术BlockingCollection与并发队列

C-v*_*-va 39 concurrency consumer producer c#-3.0

我在C#3.0和Monitor.Enter中使用Generic.Queue,等待,在使用队列之前退出等待(等待元素入队).现在我转到C#4.

任何人都可以建议我哪一个是快速的,尤其是避免锁定..

BlockingCollection vs concurrentQueue或其他任何东西......

注意.我不想限制我的制片人

提前致谢..

Jon*_*eet 111

BlockingCollectionConcurrentQueue在那里正是这个原因.我怀疑你会发现更好,或更简单的使用.并行扩展团队知道他们的东西:)

只是快速检查版本 - 你肯定使用的是.NET 4,而不仅仅是C#4?(例如,您可能正在使用Visual Studio 2010,因此使用C#4,但仍然以.NET 3.5为目标,在这种情况下,您无法使用Parallel Extensions.)

您可能还想开始研究基于任务的异步模式,TPL数据流C#5异步/等待功能 ......显然您还不能使用它们,但知道即将发生的事情并没有什么坏处.

  • @MSK:你真的*读过*我的评论吗?*你一起使用这两种类型.*创建一个`ConcurrentQueue`,然后创建一个`BlockingCollection`来包装它.然后专门使用`BlockingCollection`.(事实上​​,如果您只是创建一个BlockingCollection而不向构造函数传递任何内容,它将为您创建一个ConcurrentQueue,但您应该了解发生了什么.) (27认同)
  • 有关ConcurrentQueue的一点,我刚刚遇到Pro/Con实现... http://blogs.msdn.com/b/pfxteam/archive/2012/05/08/concurrentqueue-lt-t-gt-如果物品很小的话就没有大问题......如果它们是大型物体(如我的那样)则是一个重大问题 (7认同)
  • @MSK:你创建一个`ConcurrentQueue`然后将它包装在一个协调Add/Take方法的`BlockingCollection`中.(然后让它完全管理队列 - 之后你不应该直接触摸ConcurrentQueue.) (6认同)
  • BlockingCollection默认包装ConcurrentQueue - http://msdn.microsoft.com/en-us/library/dd267312(v=vs.110).aspx (5认同)
  • @MSK:我不知道还有什么要告诉你的......我已经告诉你如何做两次了.您是否阅读过BlockingCollection的文档,以及那里的示例? (3认同)
  • @MSK:BlockingCollection.Take的文档是什么意思?(您可能还想查看BlockingCollection.GetConsumingEnumerable()). (2认同)
  • @MSK:没错.因此,如果队列为空,它将阻塞,直到队列中有一个项目为止.使用该类型的重点是避免使用等等. (2认同)