71 votes

Comment supprimer tous les éléments de ConcurrentBag?

Comment effacer les ConcurrentBag ? il n'a pas de méthode comme Clear ou RemoveAll ...

59voto

Adam Houldsworth Points 38632

Vous pouvez toujours verrouiller l'accès pour le sac lui-même et de créer une nouvelle instance. Articles dans le sac seront alors éligibles pour le GC, si rien d'autre n'est tenue sur eux:

lock (something)
{
    bag = new ConcurrentBag();
}

Moyen facile de bin le contenu, cependant, cela suppose que chaque fois qu'un élément veut accéder, il obtient également le lock - ce qui pourrait être coûteux et peut annuler le réglage de la performance qui a disparu dans l' ConcurrentBag lui-même.

Si vous savez que rien d'autre n'a accès le sac à ce moment, l'aile et la prière et ne pas verrouiller :-)

37voto

Daniel A. White Points 91889
T someItem;
while (!myBag.IsEmpty) 
{
   myBag.TryTake(out someItem);
}

23voto

Will Points 76760

La réponse sélectionnée est une sorte de bien, une solution de contournement, donc je vais ajouter ma propre solution de contournement.

Ma solution a été de regarder toutes les collections disponibles dans le Système.Les Collections.Simultanée de l'espace de noms d'en trouver un où il était trivial pour effacer tous les éléments de la collection.

Le ConcurrentStack classe a un Clear() méthode qui supprime tous les éléments de la collection. En fait, c'est la seule collection dans l'espace de noms (pour l'instant) qui n'. Oui, vous avez Push(T element) au lieu de Add(T element), mais franchement ça vaut le gain de temps.

8voto

gor Points 6313

Vous pouvez supprimer les objets un à un dans une boucle:

 object result;
while (bag.TryTake(out result));
 

Notez que sac n'est pas garanti d'être vide après cette boucle, car des éléments peuvent être ajoutés une fois la boucle terminée et avant la prochaine instruction par un autre thread.

7voto

OlduwanSteve Points 575

Dans l’esprit des solutions de contournement, ConcurrentDictionary<T, bool> a un Clear atomique, mais vous permet également de vérifier rapidement si une clé existe. «Rapidement» est un terme relatif bien sûr, mais en fonction de votre utilisation, il peut être plus rapide que d'énumérer une pile volumineuse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X