如何创建不重复的ConcurrentQueue?
我需要一个不允许重复的concurent集合(在BlockingCollection中用作Producer / Consumer)。 我不需要严格的元素顺序。 从另一方面,我想最小化元素“活”在集合中的最大时间。 即收集不能是LIFO,理想情况下它应该是FIFO。
好吧,我会说我需要ConcurrentQueue而不允许重复,但是没有重复的ConcurrentBag也可以工作。
为什么C#不包含这样的东西,可能有人已经创建了它?
这个问题是我之前的问题的结果, 什么类型的IProducerConsumerCollection 用于我的任务?
没有内置的.Net库将这组规则组合在一起。 你有三个选择:
- 编写自己的集合类
- 使用两个集合:编写一个使用一个ConcurrentQueue的自定义类和任何自动检查重复项的基于集合的集合; 添加到Set run,如果成功,添加到ConcurrentQueue; 每次添加/删除都会在成功时添加到两个集合中
- 使用ConcurrentQueue但迭代整个列表检查重复
最后两个不是很有效(一个有内存,另一个有CPU,I / O,锁定)并且由于需要显式锁定而更加混乱,但是可以完成任务。 它们将更快地实施,但如果权衡不符合您的要求,您将不得不使用选项#1。
好吧,如果你真的想要没有重复,你需要’集’。 例如,NHibernate使用Iesi.Collections来提供这样的function。 以Iesi为例,您可以围绕提供的’Set’类(DictionarySet,HashSet,SortedSet)构建自己的function。 资料来源: http : //www.codeproject.com/KB/recipes/sets.aspx
您可以简单地使用ConcurrentQueue
并在调用Enqueue
之前通过调用ConcurrentQueue.Contains<>
方法检查数据是否在队列中。 我猜测Contains<>
扩展方法相当好。
编辑:正如其他人已经指出的那样,为了实现这一点,你必须在Contains<>
方法和Enqueue
方法周围使用锁定机制,如互斥锁等,如下所示:
get mutex if not Contains<> { Enqueue } release mutex