如何创建无重复的ConcurrentQueue

本文关键字:ConcurrentQueue 何创建 创建 | 更新日期: 2023-09-27 17:53:53

我需要一个不允许重复的并发集合(在BlockingCollection中作为生产者/消费者使用)。我不需要严格的元素顺序。另一方面,我想最小化元素的"寿命"最长时间。在收集。也就是说,收集不能是后进先出,理想情况下应该是先进先出。

嗯,我会说我需要不允许重复的ConcurrentQueue,但是没有重复的ConcurrentBag也可能工作。

为什么c#不包含这样的东西,可能有人已经创建了它?

这个问题是我上一个问题的结果IProducerConsumerCollection用于我的任务?

如何创建无重复的ConcurrentQueue

没有内置的。net库将这组规则组合到一个集合中。您有三个选项:

  1. 编写自己的collection类
  2. 使用两个集合:编写一个自定义类,使用一个ConcurrentQueue和任何自动检查重复项的基于set的集合;添加到Set运行,如果成功,添加到ConcurrentQueue;每次添加/删除都将在成功时添加到两个集合
  3. 使用ConcurrentQueue但是遍历整个列表检查是否有重复

后两个不是很有效(一个使用内存,另一个使用CPU、I/O和锁定),并且由于需要显式锁定而更混乱,但可以完成任务。它们将更快地实现,但如果权衡不符合您的需求,您将不得不使用选项#1。

如果你严格要求没有重复项,你就需要'Sets'。例如,NHibernate使用Iesi。集合来提供这样的功能。使用Iesi,您可以围绕提供的"Set"类(DictionarySet, HashSet, SortedSet)构建自己的功能。来源:http://www.codeproject.com/KB/recipes/sets.aspx

您可以简单地使用ConcurrentQueue,并在调用Enqueue之前通过调用ConcurrentQueue.Contains<>方法检查数据是否在队列中。我猜Contains<>扩展方法是相当好的优化。

编辑:正如其他人注意到的那样,要使其工作,您必须在Contains<>方法和Enqueue方法周围使用锁机制,如互斥锁等,如下所示:

get mutex
if not Contains<>
{
    Enqueue
}
release mutex