BlockingCollection garantit-il une mesure de renvoi?

J’ai une queue bloquante bornée dans une application écrite il y a plusieurs années. Disons simplement que la mise en œuvre est moins qu’étonnant, mais que cela fonctionne. Cependant, il a quelques problèmes de performances. Il semble que BlockingCollection .NET 4.0 BlockingCollection soit le bon remplaçant, mais je dois m’assurer qu’il s’agit bien d’une queue. Autrement dit, est-il garanti d’être ssortingctement FIFO s’il est utilisé dans un mode mono-producteur, mono-consommateur?

La documentation ne dit pas spécifiquement. La rubrique BlockingCollection dit (dans les remarques):

BlockingCollection est similaire à une structure de données de queue de blocage traditionnelle, à la différence que le mécanisme de stockage de données sous-jacent est extrait sous la forme d’un IProducerConsumerCollection .

Mais rien n’indique spécifiquement que les éléments seront supprimés dans le même ordre.

Quelqu’un sait à coup sûr?

Eh bien, BlockingCollection est vraiment conçu pour le travail en parallèle, où vous avez plusieurs “producteurs” simultanés et un consommateur (en utilisant GetConsumingEnumerable ()).

Dans cette situation, vous n’avez aucun moyen de garantir l’ordre d’insertion. Par conséquent, les contraintes d’ordre ne sont pas spécifiées.

Cela étant dit, BlockingCollection fonctionne sur tout IProducerConsumerCollection (spécifié dans le constructeur). Si vous n’en fournissez pas dans le constructeur, en interne, il utilisera une ConcurrentQueue . Cela le fait être FIFO, puisqu’il s’agira réellement (en interne) d’une queue. Donc, oui, par défaut, il sera “garanti d’être ssortingctement FIFO s’il est utilisé dans un mode mono-producteur, mono-consommateur”, du moins dans la mise en œuvre actuelle. Si vous souhaitez le forcer pour une future vérification (étant donné que la queue est un détail d’implémentation), construisez-la simplement comme suit:

 var blockingCollection = new BlockingCollection(new ConcurrentQueue()); 

Cela garantira qu’il utilise une queue maintenant et à l’avenir (car la queue est un détail de la mise en œuvre).

La documentation MSDN a peut-être été mise à jour depuis cette question, mais elle indique désormais clairement que BlockingCollection utilisera par défaut la FIFO, sauf indication contraire.

voir: https://msdn.microsoft.com/en-us/library/dd997371(v=vs.110).aspx ou si MS modifie le lien google ‘MSDN BlockingCollection Overview’

NET Framework 4.6 et 4.5

Recherchez “Spécifier le type de collection” sur cette page.