Ganz einfach: Anders als ConcurrentDictionary (die ich verwenden werde, wenn ich muss, aber es ist nicht wirklich das richtige Konzept), gibt es eine Concurrent-Sammlung (IProducerConsumer-Implementierung), die das Entfernen bestimmter Elemente basierend auf einfacher Gleichheit eines Elements oder unterstützt ein Prädikat, das eine Bedingung für das Entfernen definiert?Gleichzeitige Sammlung unterstützt das Entfernen eines bestimmten Artikels?
Erläuterung: Ich verfüge über einen mehrstufigen Arbeitsablaufalgorithmus mit mehreren Threads, der Objekte aus der Datenbank abruft und in eine "Start" -Warteschlange einfügt. Von dort werden sie von der nächsten Stufe gepackt, weiter bearbeitet und in andere Warteschlangen gestopft. Dieser Prozess wird in einigen weiteren Schritten fortgesetzt. In der Zwischenzeit wird die erste Stufe von ihrem Supervisor erneut aufgerufen und zieht Objekte aus der Datenbank heraus, und diese können Objekte enthalten, die noch in Bearbeitung sind (weil sie nicht fertig bearbeitet wurden und daher nicht mit der gesetzten Flagsgruppe erneut gesetzt wurden) sie sind fertig).
Die Lösung, die ich entwerfe, ist eine Master-Sammlung "in Arbeit"; Objekte gehen in diese Warteschlange, wenn sie zur Verarbeitung in der ersten Stufe abgerufen werden, und werden entfernt, nachdem sie in der Datenbank als "verarbeitet" gespeichert wurden, egal in welcher Phase des Arbeitsablaufs die erforderliche Verarbeitung abgeschlossen wurde. Solange sich das Objekt in dieser Liste befindet, wird es ignoriert, wenn es von der ersten Stufe erneut abgerufen wird.
Ich hatte geplant, eine ConcurrentBag zu verwenden, aber die einzige Entfernungsmethode (TryTake) entfernt ein beliebiges Element aus der Tasche, nicht eine bestimmte (und ConcurrentBag ist langsam in .NET 4). ConcurrentQueue und ConcurrentStack erlauben auch nicht das Entfernen eines anderen Elements als das nächste, das es Ihnen geben wird. ConcurrentDictionary bleibt bestehen, das funktioniert, ist aber mehr als ich brauche (alles was ich wirklich brauche, ist die ID der verarbeiteten Datensätze zu speichern; Sie ändern sich während des Workflows nicht).
, wie fühlen Sie sich über ReaderWriterLockSlim verwenden und eine Liste? oder vielleicht rollen Sie Ihre eigene gleichzeitige Sammlung – Frobzig
@Frobzig - Ambivalent zu mild interessiert. Ich mag die Concurrent-Sammlungen, weil sie einfach funktionieren. sehr wenig Code beteiligt. – KeithS