快速和最佳的生产者/消费者队列技术:BlockingCollection vs ConcurrentQueue。

46
我正在使用 C# 3.0 中的 Generic.Queue 和 Monitor.Enter、Wait、Exit 来在消耗队列之前等待(等待元素入队)。现在我要转移到 C# 4。请问有人能建议我哪种方法更快更好,尤其是为了避免锁定...是 BlockingCollection 还是 ConcurrentQueue 或其他任何东西...注意:我不想限制我的生产者。谢谢提前。
1个回答

118

BlockingCollectionConcurrentQueue 就是为了这个目的而存在的。我怀疑你找不到比它们更好、更简单易用的东西了。并行扩展团队非常专业 :)

只是需要快速检查一下版本 - 您确定使用的是.NET 4,而不仅仅是C# 4吗?(例如,您可能在使用Visual Studio 2010和C# 4,但仍面向.NET 3.5,在这种情况下,您无法使用Parallel Extensions。)

您可能还想开始研究基于任务的异步模式TPL数据流以及C# 5的异步/等待功能… 当然,您现在还不能使用它们,但了解即将出现的新功能也无妨。


7
您创建了一个 ConcurrentQueue,然后将其包装在 BlockingCollection 中,以协调 Add/Take 方法。(然后让它完全管理队列 - 之后不应直接自行操作 ConcurrentQueue。) - Jon Skeet
28
@MSK: 你真的读过我的评论吗? 你把两种类型一起使用。 创建一个“ConcurrentQueue”,然后创建一个包装它的“BlockingCollection”。 然后专门使用“BlockingCollection”即可。(实际上,如果只是创建一个“BlockingCollection”,而不向构造函数传递任何内容,它会为您创建一个“ConcurrentQueue”,但您应该理解其中的原理。) - Jon Skeet
3
@MSK:我真的不知道该怎么告诉你了……我已经告诉过你两次如何操作了。你有阅读过BlockingCollection的文档以及其中的示例吗? - Jon Skeet
7
关于ConcurrentQueue的一个问题,我刚用Pro/Con实现时遇到了... 如果项目很小,这个问题就不大...但如果它们是大对象(像我的一样),那就是一个重要问题。参考链接:http://blogs.msdn.com/b/pfxteam/archive/2012/05/08/concurrentqueue-lt-t-gt-holding-on-to-a-few-dequeued-elements.aspx - Dave Lawrence
6
BlockingCollection 默认包装 ConcurrentQueue - http://msdn.microsoft.com/zh-cn/library/dd267312(v=vs.110).aspx - jjxtra
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接