ConcurrentBag <T>的实际使用是什么?

Dus*_*vis 16 .net-4.0 task-parallel-library

ConcurrentBag将允许多个线程添加和删除包中的项目.线程可能会将一个项目添加到包中,然后最终将该项目重新取出.它说ConcurrentBag是无序的,但是它有多无序?在单个线程上,行李就像一个堆栈.无序意味着"不像链接列表"吗?

ConcurrentBag的真实用途是什么?

Ivo*_*ops 17

因为没有排序,ConcurrentBag比ConcurrentStack/Queue具有性能优势.它由Microsoft实现为本地线程存储.因此,添加项目的每个线程都会在自己的空间中执行此操作.检索项目时,它们来自本地存储.只有当它为空时,线程才会从另一个线程存储中窃取项目.因此,ConcurrentBag不是一个简单的列表,而是一个分布式的项目列表.并且几乎是无锁的,并且应该在高并发性的情况下更好地扩展.

不幸的是,在.NET 4.0中存在性能问题(在4.5中修复),请参阅 http://ayende.com/blog/156097/the-high-cost-of-concurrentbag-in-net-4-0


Chr*_*ung 3

包对于跟踪实例计数非常有用。例如,如果您想记录正在为哪些主机提供 Web 请求服务,则可以在开始为请求提供服务时将其 IP 添加到包中,并在完成后将其删除。

使用包可以让您一目了然地知道您当前正在为哪些 IP 提供服务。它还可以让您快速查询您是否正在为给定的 IP 地址提供服务。

如果您使用一组而不是包,那么来自同一 IP 地址的多个并发请求将会扰乱您的记录保存。

  • 你说将他们的 IP 添加到包中,然后在完成后将其删除。如何从包中取出特定物品? (10认同)
  • @达斯汀:好问题。我正在考虑 [`ConcurrentHashMultiset`](https://guava-libraries.googlecode.com/svn/tags/release09/javadoc/com/google/common/collect/ConcurrentHashMultiset.html) (Java 相当于 `ConcurrentBag` )当我写我的答案时,它_确实_有一个“删除”方法。那么我不知道 .NET `ConcurrentBag` 类有什么用处。:-P (2认同)
  • 没关系,根据您的回答,我能够想出一个适用于我自己的现实世界场景。 (2认同)