【发布时间】:2011-09-20 19:06:27
【问题描述】:
ConcurrentBag 将允许多个线程从包中添加和删除项目。线程可能会将一个项目添加到包中,然后最终将相同的项目重新取出。它说 ConcurrentBag 是无序的,但它有多无序?在单个线程上,袋子就像一个堆栈。 unordered 是否意味着“不像链表”?
ConcurrentBag 的实际用途是什么?
【问题讨论】:
-
你的意思是“它有多无序”?要么有定义的顺序,要么没有。这就像在说“猫王死了多少?”
-
存储元素的排序与客户无关。所以从 API 的角度来看,“无序”总是指枚举的顺序(来自
GetEnumerator方法)。 -
“未订购”表示不保证订单。当前实现的行为似乎是,当同一个线程正在添加和删除时,它就像一个堆栈,当一个线程从另一个线程的集合中获取时,它就像一个队列。但我不会指望这种行为。有关更多信息,请参阅informit.com/guides/content.aspx?g=dotnet&seqNum=842。如果顺序不重要,并且线程既可以是生产者又可以是消费者,
ConcurrentBag可以提供比ConcurrentQueue更好的性能。
标签: .net-4.0 task-parallel-library