如何创建一个不重复的ConcurrentQueue?我需要一个不允许重复的并发集合(在BlockingCollection中用作生产者/消费者)。我不需要严格的元素顺序。另一方面,我想尽量减少元素在集合中“存在”的最长时间。即收集不能是LIFO,理想情况下它应该是FIFO。好吧,我会说我需要一个不允许重复的ConcurrentQueue,但是没有重复的ConcurrentBag也可以。为什么C#不包括这样的东西,也许有人已经创建了它?这个问题是我之前的问题“WhattypeofIProducerConsumerCollectiontouseformytask?”的结果。没有内置的.Net库来将这组规则放在一起。您有三个选择:编写您自己的使用两个集合的集合类:编写一个自定义类,使用一个ConcurrentQueue和任何基于集合的自动检查重复项的集合;添加到Set运行,成功则添加到ConcurrentQueue;每次添加/删除都将使用ConcurrentQueue成功添加到两个集合中,但是迭代整个列表检查最后两个的重复项不是很有效(一个有内存,另一个有CPU、I/O、锁定)和由于需要显式锁定,效率不是很高更混乱,但可以完成工作。它们实施起来会更快,但如果权衡不符合您的要求,您将不得不使用选项#1。好吧,如果您真的不想重复,则需要“集合”。例如,NHibernate使用Iesi.Collections来提供这样的功能。以Iesi为例,您可以围绕提供的“Set”类(DictionarySet、HashSet、SortedSet)构建自己的功能。来源:http://www.codeproject.com/KB/recipes/sets.aspx您可以简单地使用ConcurrentQueue并在调用Enqueue之前通过调用ConcurrentQueue.Contains方法检查数据是否在队列中。我猜Contains扩展方法非常好。编辑:正如其他人已经指出的那样,为了实现这一点,您必须在Contains方法和Enqueue方法周围使用锁定机制,例如互斥锁等,如下所示:分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——getmutexifnotContains{Enqueue}releasemutex本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
