2011-10-04 14 views
5

Tengo un BlockingCollection concurrente con elementos repetidos. ¿Cómo se puede modificar para agregar u obtener elementos distintos?Colecciones concurrentes y elementos únicos

+1

Agregar elementos distintos parece ser [sorprendentemente difícil] (http://stackoverflow.com/questions/6603969/how-to-access-the-underlying-default-concurrent-queue-of-a-blocking-collection) si no imposible 'BlockingCollection' implementa' IEnumerable ', por lo que puede usar' Distinct() '. –

+0

Puede usar el código provisto en la pregunta StackOverflow vinculada por GertArnold, pero simplemente siempre devuelve verdadero en la implementación TryAdd y TryTake de un IProducerConsumerCollection. Esto funcionaría Sé que es terrible, pero funcionaría, y BlockingCollection ya se está rompiendo debido a que arroja una excepción. Qué terriblemente molesto. – Kevek

Respuesta

4

La tienda de respaldo predeterminada para BlockingCollection es ConcurrentQueue. Como alguien más señaló, es bastante difícil agregar elementos distintos usando eso.

Sin embargo, puede crear su propio tipo de colección que implementa IProducerConsumerCollection y pasarlo al constructor BlockingCollection.

Imagine un ConcurrentDictionary que contiene las claves de los artículos que están actualmente en la cola. Para agregar un artículo, primero llama al TryAdd en el diccionario y, si el elemento no está en el diccionario, lo agrega y también lo agrega a la cola. Take (y TryTake) obtiene el siguiente artículo de la cola, lo elimina del diccionario y lo devuelve.

Preferiría si hubiera un concurrente HashTable, pero dado que no hay uno, tendrá que ver con ConcurrentDictionary.

Cuestiones relacionadas