5
我有并发BlockingCollection
与重复的元素。如何修改它以添加或获取不同的元素?并发收藏和独特元素
我有并发BlockingCollection
与重复的元素。如何修改它以添加或获取不同的元素?并发收藏和独特元素
BlockingCollection
的默认后备存储是ConcurrentQueue
。正如其他人指出的那样,使用它添加不同的项目是相当困难的。
但是,您可以创建自己的集合类型,实现IProducerConsumerCollection
,并将其传递给构造函数BlockingCollection
。
想象一下ConcurrentDictionary
,其中包含当前正在队列中的项目的键。要添加项目,首先在字典上调用TryAdd
,如果该项目不在字典中,请添加它,并将其添加到队列中。 Take
(和TryTake
)从队列中获取下一个项目,将其从字典中移除并返回。
我宁愿如果有并发HashTable
,但由于没有一个,你必须与ConcurrentDictionary
。
添加不同的元素似乎是[令人惊讶的困难](http://stackoverflow.com/questions/6603969/how-to-access-the-underlying-default-concurrent-queue-of-a-blocking-collection)如果不是不可能。 'BlockingCollection'确实实现了'IEnumerable',所以你可以使用'Distinct()'。 –
您可以使用由GertArnold链接的StackOverflow问题中提供的代码,但总是在TryProducerConsumerCollection的TryAdd和TryTake实现中返回true。这会工作。我知道这是非常糟糕的形式,但它会工作,并且BlockingCollection已经打破了形式,因为它引发了一个异常。非常烦人。 – Kevek