2011-10-04 38 views
5

我有并发BlockingCollection与重复的元素。如何修改它以添加或获取不同的元素?并发收藏和独特元素

+1

添加不同的元素似乎是[令人惊讶的困难](http://stackoverflow.com/questions/6603969/how-to-access-the-underlying-default-concurrent-queue-of-a-blocking-collection)如果不是不可能。 'BlockingCollection'确实实现了'IEnumerable ',所以你可以使用'Distinct()'。 –

+0

您可以使用由GertArnold链接的StackOverflow问题中提供的代码,但总是在TryProducerConsumerCollection的TryAdd和TryTake实现中返回true。这会工作。我知道这是非常糟糕的形式,但它会工作,并且BlockingCollection已经打破了形式,因为它引发了一个异常。非常烦人。 – Kevek

回答

4

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

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

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

我宁愿如果有并发HashTable,但由于没有一个,你必须与ConcurrentDictionary