Параллельные Коллекции и Уникальные элементы - PullRequest
5 голосов
/ 04 октября 2011

У меня есть одновременно BlockingCollection с повторяющимися элементами. Как можно изменить его, чтобы добавить или получить отдельные элементы?

1 Ответ

4 голосов
/ 05 октября 2011

Резервным хранилищем по умолчанию для BlockingCollection является ConcurrentQueue. Как кто-то еще отметил, довольно сложно добавлять отдельные элементы, используя это.

Однако вы можете создать свой собственный тип коллекции, который реализует IProducerConsumerCollection, и передать его конструктору BlockingCollection.

Представьте себе ConcurrentDictionary, который содержит ключи элементов, которые в данный момент находятся в очереди. Чтобы добавить элемент, сначала необходимо вызвать TryAdd в словаре, а если элемент отсутствует в словаре, добавить его, а также добавить в очередь. TakeTryTake) получить следующий элемент из очереди, удалить его из словаря и вернуть.

Я бы предпочел, если бы был одновременный HashTable, но поскольку его нет, вам придется иметь дело с ConcurrentDictionary.

...