Comment effacer les ConcurrentBag
? il n'a pas de méthode comme Clear
ou RemoveAll
...
Réponses
Trop de publicités?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 :-)
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.
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.