Wie entfernt man alle Artikel von ConcurrentBag?
Wie klar die ConcurrentBag
? es gibt noch keine Methode, wie Clear
oder RemoveAll
...
Kommentar zu dem Problem
Möchten Sie vielleicht Lesen Sie in diesem social.msdn.microsoft.com/Forums/en-US/...
InformationsquelleAutor der Frage PawanS | 2011-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
InformationsquelleAutor der Antwort Daniel A. White
Update 10/03/2017: Wie @Lou ganz richtig fest, die Zuweisung ist atomar. In diesem Fall, die Schaffung des
ConcurrentBag
wird nicht atomar sind, sondern dass die, die Referenz in der variable wird atomar - also sperren oderInterlocked.Exchange
rund es ist nicht unbedingt erforderlich.Einige weitere Lesung:
Referenz-Zuweisung ist atomar, also warum ist Verriegelt.Exchange(ref-Objekt) benötigt?
Ist eine Referenz-Zuordnung threadsicher?
Konnte man immer sperren den Zugang zu der Tasche selbst, und erstellen Sie eine neue Instanz davon. Gegenstände in der Tasche wird dann elligible für die GC, wenn sonst nichts hält Sie auf:
Oder als Lukazoid Punkte heraus:
Einfach Weg bin, den Inhalt, doch dieser geht davon aus, dass, wenn ein Element zugreifen möchte wird es auch in den Schloss - das könnte teuer werden und könnte zu negieren das performance-tuning, hat sich in der
ConcurrentBag
selbst.Wenn Sie wissen, dass nichts anderes auf die Tasche zu diesem Zeitpunkt, Flügel und einem Gebet und nicht sperren 🙂
InformationsquelleAutor der Antwort Adam Houldsworth
Die ausgewählte Antwort ist irgendwie, naja, ein workaround, so dass ich bin das hinzufügen meiner eigenen workaround.
Meine Lösung war, sich auf alle verfügbaren Sammlungen im System.Sammlungen.Gleichzeitige namespace zu finden, wo es war trivial, deaktivieren Sie alle Elemente aus der Sammlung.
Den ConcurrentStack Klasse hat eine Klar() Methode entfernt alle Elemente aus der Sammlung. In der Tat, es ist die einzige Sammlung in den namespace (derzeit) nicht. Ja, Sie haben
Push(T element)
stattAdd(T element)
, aber ehrlich gesagt, lohnt sich die Zeitersparnis.InformationsquelleAutor der Antwort Will
Können Sie entfernen Sie den Gegenstand nacheinander in einer Schleife:
Beachten Sie, dass die Tasche nicht garantiert leer sein, nach dieser Schleife, da die Elemente können Hinzugefügt werden, nachdem die Schleife beendet ist und bevor die nächste Anweisung vom anderen thread.
InformationsquelleAutor der Antwort gor
In den Geist des workarounds..
ConcurrentDictionary<T, bool>
hat eine Atomare Klar, sondern auch ermöglicht es Ihnen, schnell zu überprüfen, ob ein Schlüssel vorhanden ist. 'Bald' ist ein relativer Begriff, natürlich, aber je nach Nutzung könnte es schneller sein als das aufzählen einer großen stack.InformationsquelleAutor der Antwort OlduwanSteve