2013-06-10 2 views
1

Je veux limiter la taille de BlockingCollection. Si je veux ajouter un autre élément et que la collection est pleine, la plus ancienne doit être supprimée. Y at-il une classe spécifique à cette tâche ou ma solution est ok?Comment limiter la taille de BlockingCollection tout en continuant à ajouter de nouveaux Itens (FIFO de taille limitée .NET)?

 BlockingCollection<string> collection = new BlockingCollection<string>(10); 

     string newString = ""; 
     //Not an elegant solution? 
     if (collection.Count == collection.BoundedCapacity) 
     { 
      string dummy; 
      collection.TryTake(out dummy); 
     } 
     collection.Add(newString); 

EDIT1: question similaire ici: ThreadSafe FIFO List with Automatic Size Limit Management

+0

Ce n'est plus une collection thread-safe, ce qui sera supprimé est entièrement imprévisible. Les charlots ressemblent à un cache, consultez la classe MemoryCache. –

+0

Qu'est-ce que vous voulez accomplir? Pouvez-vous simplement jeter l'objet retiré sans rien faire avec? –

+0

@Hans Passant, hé! Vous êtes partout! :) Je ne comprends pas pourquoi il n'est plus sûr de filetage ... – Pedro77

Répondre

2

Ce que vous décrivez est un cache LRU. Je ne connais aucune implémentation dans les bibliothèques standard, mais cela ne serait pas difficile à créer. Regardez ce C++ implementation pour quelques indices.


Modifier

Essayez this one du projet de code

+0

Merci, mais cette solution est plutôt gentille (2008). L'auteur l'a commenté: "C'est une idée intéressante ... " Le ConcurrentDictionary peut fonctionner mieux que ma solution (qui a été écrite plusieurs années avant que cette classe ne devienne disponible.) Si quelqu'un a le temps de la modifier et d'exécuter des tests de performance J'aimerais voir les résultats. " – Pedro77

2

Votre solution fonctionne correctement, mais il est pas thread-safe. BlockingCollection<T> ne fournit pas un mécanisme pour gérer cela directement.

Votre solution peut toujours bloquer (si un autre thread appelle Add() après votre TryTake) ou potentiellement supprimer un élément supplémentaire (si un autre thread supprime pendant que vous supprimez également).

+0

J'ai résisté BlockingCollection était thread safe. De MSDN: "BlockingCollection est une classe de collection thread-safe qui fournit les fonctionnalités suivantes:" http://msdn.microsoft.com/en-us/library/dd997371.aspx Qu'est-ce qui me manque ici? – Pedro77

+0

@ Pedro77 BlockingCollection ** est ** thread-safe, c'est votre utilisation de la collection qui ne l'est pas. Votre solution peut facilement conduire à moins d'éléments ou à un blocage, puisque vous ne verrouillez pas et n'utilisez pas les méthodes directement sur BC dans un seul appel de méthode. –

+0

pouvez-vous s'il vous plaît clarifier? Je suis un débutant BlockingCollection, je ne peux pas voir l'impasse ... Chaque thread peut seulement ajouter ou supprimer, pas les deux? – Pedro77

Questions connexes