So entfernen Sie ein einzelnes, spezifisches Objekt aus einem ConcurrentBag & lt; & gt ;?
Mit der neuen ConcurrentBag<T>
.NET 4, wie entfernt man eine bestimmte Objekt aus, wenn nur TryTake()
und TryPeek()
erhältlich sind?
Ich bin denken mit TryTake()
und dann einfach nur mit dem Gegenstand, der Sie zurück in die Liste, wenn ich nicht wollen, um es zu entfernen, aber ich fühle mich wie ich könnte etwas fehlen. Ist das der richtige Weg?
InformationsquelleAutor der Frage Brandon | 2010-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort: Sie kann es nicht auf eine einfache Weise.
Den ConcurrentBag hält eine thread-lokale Warteschlange für jeden thread und es sieht nur auf andere threads Warteschlangen einmal seine eigene Warteschlange leer ist. Wenn Sie ein Element entfernen und legen Sie es dann das nächste Element, das Sie entfernen kann, kann das gleiche Element wieder. Es gibt keine Garantie, dass immer wieder Elemente entfernen und setzen Sie Sie zurück, wird Ihnen erlauben, zu iterieren über alle Elemente.
Zwei alternativen für Sie:
InformationsquelleAutor der Antwort Mark Byers
Können Sie nicht. Seine eine Tasche, es ist nicht der bestellten entspricht. Wenn du es zurück, dann bekommst du nur in einer Endlosschleife geraten.
Du willst einen Satz. Sie emulieren kann man mit Z. B. concurrentdictionary. Oder ein HashSet, dass Sie schützen sich selbst mit einem Schloss.
InformationsquelleAutor der Antwort Hans Passant
Wie Sie erwähnen,
TryTake()
ist die einzige option. Dies ist auch das Beispiel auf MSDN. Reflektor zeigt keine anderen versteckten internen Methoden von Interesse.InformationsquelleAutor der Antwort Mikael Svenson
Den ConcurrentBag ist groß, um zu behandeln eine Liste, wo Sie können Elemente hinzufügen und auflisten von viele thread, dann werfen Sie es Weg, wie sein name suggeriert 🙂
Als Mark Byers erzähltkönnen Sie re-build eine neue ConcurrentBag, dass nicht das Element enthält, das Sie entfernen möchten, aber Sie haben, um dieses zu schützen gegen mehrere threads, die sich zuvor mit einem lock. Dies ist ein one-liner:
Dies funktioniert, und passen Sie der Geist, in dem die ConcurrentBag konzipiert wurde.
InformationsquelleAutor der Antwort Larry
Mark ist richtig, dass das Z. B. concurrentdictionary ist, wird die Arbeit in der Weise, die Sie wollen. Wenn Sie möchten, verwenden Sie immer noch ein ConcurrentBag die folgenden, nicht effizient, wohlgemerkt, Sie dort bekommen wird.
InformationsquelleAutor der Antwort Rkaufman
Dies ist mein extension-Klasse, die ich benutze in meinen Projekten. Es kann ein entfernen einzelner Elemente aus ConcurrentBag und kann auch entfernen, die Liste der Gegenstände aus dem Beutel
InformationsquelleAutor der Antwort huda
InformationsquelleAutor der Antwort huda
InformationsquelleAutor der Antwort Evgeniy Nikulov
wie etwa:
Es funktioniert, ich bin mir nicht sicher, wie Sie Sie effizient...
InformationsquelleAutor der Antwort Simon Gullive