Tengo un BlockingCollection
concurrente con elementos repetidos. ¿Cómo se puede modificar para agregar u obtener elementos distintos?Colecciones concurrentes y elementos únicos
Respuesta
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
.
- 1. ¿Por qué no hay colecciones concurrentes en C#?
- 2. Obtener elementos únicos de NSMutableArray
- 3. ¿Cuál es la diferencia entre SynchronizedCollection <T> y las otras colecciones concurrentes?
- 4. GroupBy y cuente los elementos únicos en una lista
- 5. perl: contar elementos únicos en la matriz
- 6. XPath para obtener nombres de elementos únicos
- 7. ¿Detecta modificaciones concurrentes?
- 8. Contenedor para una pila de elementos únicos
- 9. ¿Cómo obtengo elementos únicos en esta matriz?
- 10. Contando elementos únicos en una lista
- 11. elementos únicos en una lista de haskell
- 12. elementos existentes en ambas colecciones usando LINQ
- 13. C# fusionar elementos distintos de 2 colecciones
- 14. Nodos XmlPoke y únicos
- 15. Por qué las colecciones concurrentes de Java son realmente seguras para subprocesos
- 16. Depurador y colecciones de Eclipse
- 17. ASP.NET MVC y Ajax, solicitudes concurrentes?
- 18. ASP.NET (MVC) Outputcache y solicitudes concurrentes
- 19. Problemas Queuing concurrente y no concurrentes
- 20. Identificación de elementos únicos en una matriz de celdas
- 21. Comprensión de la lista de Python, con elementos únicos
- 22. ¿Cómo asegurar que la lista contiene elementos únicos?
- 23. Contando elementos únicos en el marco de datos
- 24. ¿Obtienes elementos únicos de la lista de listas?
- 25. Cómo en Scala para encontrar elementos únicos en la lista
- 26. ¿Colección que solo permite elementos únicos en .NET?
- 27. Encontrar elementos únicos en una matriz de cadenas en C
- 28. Cola de bloqueo de Java que contiene solo elementos únicos
- 29. Comprobando si todos los elementos en una lista son únicos
- 30. Ejecutando scripts PHP concurrentes
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() '. –
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