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