我有许多线程可以将项目添加到集合中,并在某些条件下从该集合中删除特定项目。在第一个项目中,读者多于作者。在第二个项目中,读者可能多于作者,也可能相等或更少。
- 我应该如何管理对该集合的添加/删除?
- 使用什么收藏?简单
List
地阻止添加/删除? - 使用哪种阻塞机制(
lock
,,ReaderWriterLockSlim
...)?
我有许多线程可以将项目添加到集合中,并在某些条件下从该集合中删除特定项目。在第一个项目中,读者多于作者。在第二个项目中,读者可能多于作者,也可能相等或更少。
List
地阻止添加/删除?lock
,,ReaderWriterLockSlim
...)?您可以使用命名空间中的数据结构System.Collections.Concurrent
。它们封装了您提到的所有三个方面,并且可以从并发线程中使用而无需显式锁定。
请参阅:MSDN 上的 System.Collections.Concurrent 命名空间
例如ConcurrentBag<T>
,具有ICollection
接口并且是线程安全的实现,针对同一线程将同时生产和使用存储在包中的数据的场景进行了优化。
如果您需要快速对象查找,您也可以使用ConcurrentDictionary<TKey, TValue>
.
ConcurrentBag 无法删除特定项目,因为它是对象集合无序的错误。
但是 BlockingCollection 可以使用 TryTake 方法来做到这一点。只需将要删除的项目作为参数传递。请参阅:http: //msdn.microsoft.com/en-us/library/dd287184 (v=vs.110).aspx