Gleichzeitige Sammlung, die das Entfernen eines bestimmten Elements unterstützt?

Ganz einfach: Abgesehen von ConcurrentDictionary (das ich verwenden werde, wenn ich muss, aber es ist nicht wirklich das richtige Konzept) gibt es eine Concurrent-Auflistung (IProducerConsumer-Implementierung), die das Entfernen bestimmter Elemente basierend auf der einfachen Gleichheit eines Elements oder eines Prädikats unterstützt Definieren einer Bedingung für das Entfernen?

Erläuterung: Ich habe einen mehrstufigen Workflow-Algorithmus mit mehreren Threads, der Objekte aus der Datenbank abruft und sie in eine Startwarteschlange stellt. Von dort aus werden sie von der nächsten Stufe gepackt, weiter bearbeitet und in andere Warteschlangen gestopft. Dieser Prozess setzt sich in einigen weiteren Schritten fort. In der Zwischenzeit wird die erste Stufe erneut von ihrem Supervisor aufgerufen und zieht Objekte aus der DB heraus. Diese können Objekte enthalten, die sich noch in Bearbeitung befinden (weil sie noch nicht fertig verarbeitet wurden und daher nicht mit dem Flaggensatz "Beharrlich" versehen wurden sie sind fertig).

Die Lösung, die ich entwerfe, ist eine Master-Sammlung "in Arbeit". Objekte werden in diese Warteschlange eingereiht, wenn sie von der ersten Stufe zur Verarbeitung abgerufen werden, und werden entfernt, nachdem sie von einer beliebigen Stufe des Workflows, die die erforderliche Verarbeitung abgeschlossen hat, als "verarbeitet" in der Datenbank gespeichert wurden. Solange sich das Objekt in dieser Liste befindet, wird es ignoriert, wenn es von der ersten Stufe erneut abgerufen wird.

Ich hatte vor, einen ConcurrentBag zu verwenden, aber die einzige Entfernungsmethode (TryTake) entfernt ein beliebiges Objekt aus dem Beutel, kein bestimmtes (und ConcurrentBag ist es)schleppend in .NET 4). ConcurrentQueue und ConcurrentStack erlauben auch nicht das Entfernen eines anderen Elements als des nächsten, das Sie erhalten, und verlassen ConcurrentDictionary, was funktionieren würde, aber mehr ist als ich brauche (alles, was ich wirklich brauche, ist das Speichern der ID der verarbeiteten Datensätze; Sie ändern sich während des Workflows nicht.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage