【问题标题】:Concurrent Collections and Unique elements并发集合和唯一元素
【发布时间】:2017-11-30 00:40:53
【问题描述】:

我有一个并发的 BlockingCollection 重复元素。如何修改它以添加或获取不同的元素?

【问题讨论】:

  • 添加不同的元素似乎是surprisingly hard,如果不是不可能的话。 BlockingCollection 确实实现了IEnumerable<T>,所以你可以使用Distinct()
  • 您可以使用 GertArnold 链接的 StackOverflow 问题中提供的代码,但在 IProducerConsumerCollection 的 TryAdd 和 TryTake 实现中始终返回 true。这会奏效。我知道这是一种糟糕的形式,但它 起作用,而且 BlockingCollection 已经打破了形式,因为它会引发异常。真烦人。

标签: c# parallel-processing blockingcollection


【解决方案1】:

BlockingCollection 的默认后备存储是 ConcurrentQueue。正如其他人指出的那样,使用它添加不同的项目相当困难。

但是,您可以创建自己的集合类型来实现IProducerConsumerCollection,并将其传递给BlockingCollection 构造函数。

想象一个ConcurrentDictionary,其中包含当前在队列中的项目的键。要添加一个项目,首先在字典上调用TryAdd,如果该项目不在字典中,则添加它,并将其添加到队列中。 Take(和TryTake)从队列中获取下一项,将其从字典中删除,然后返回。

如果有一个并发的HashTable,我会更喜欢,但既然没有,你就必须使用ConcurrentDictionary

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2020-02-22
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多