c# .net

c# - ¿BlockingCollection<T> garantiza el orden de eliminación?



.net (2)

Bueno, BlockingCollection<T> está realmente diseñado para trabajos paralelos, en los que tiene múltiples "productores" y un consumidor (utilizando GetConsumingEnumerable ()).

En esta situación, no tiene forma de garantizar el orden de inserción, por lo que no se especifican las restricciones de orden.

Dicho esto, BlockingCollection<T> funciona en cualquier IProducerConsumerCollection<T> (especificado en el constructor). Si no proporciona uno en el constructor, internamente, utilizará una ConcurrentQueue<T> . Esto hace que sea FIFO, ya que en realidad será (internamente) una cola. De modo que sí, de forma predeterminada, se "garantiza que será estrictamente FIFO si se utiliza de forma individual y de un solo consumidor", al menos en la implementación actual. Si desea forzar esto para futuras pruebas (ya que la cola es un detalle de implementación), simplemente constrúyalo como:

var blockingCollection = new BlockingCollection<MyClass>(new ConcurrentQueue<MyClass>());

Eso garantizará que use una cola ahora y en el futuro (ya que la cola es un detalle de implementación).

Tengo una cola de bloqueo limitada en una aplicación que se escribió hace varios años. Digamos que la implementación es menos que estelar, pero ha funcionado. Sin embargo, tiene algunos problemas de rendimiento. Parece que el .NET 4.0 BlockingCollection<T> es el reemplazo correcto, pero necesito asegurarme de que en realidad es una cola. Es decir, ¿está garantizado que sea estrictamente FIFO si se utiliza de manera que sea solo productor, solo consumidor?

La documentación no dice específicamente. El tema de BlockingCollection dice (en los Comentarios):

BlockingCollection<T> es similar a una estructura de datos de cola de bloqueo tradicional, excepto que el mecanismo de almacenamiento de datos subyacente se abstrae como IProducerConsumerCollection<T> .

Pero nada dice específicamente que las cosas se eliminarán en el mismo orden en que se agregaron.

¿Alguien lo sabe con seguridad?


Quizás la documentación de MSDN se haya actualizado desde esta pregunta, pero ahora indica claramente que BlockingCollection se establecerá de forma predeterminada en FIFO a menos que se indique lo contrario.

consulte: https://msdn.microsoft.com/en-us/library/dd997371(v=vs.110).aspx o en caso de que MS cambie el enlace de Google ''Descripción general de la colección de bloqueos de MSDN''

NET Framework 4.6 y 4.5

Busque ''Especificar el tipo de colección'' en esa página.