2011-10-04 37 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