非常に簡単です: ConcurrentDictionary (必要に応じて使用しますが、実際には正しい概念ではありません) 以外に、アイテムまたは述語の単純な等価性に基づいて特定のアイテムの削除をサポートするコンカレント コレクション (IProducerConsumer 実装) はありますか?削除の条件を定義しますか?
説明: DB からオブジェクトをプルして「開始」キューに入れる、マルチスレッド、マルチステージのワークフロー アルゴリズムがあります。そこから、それらは次のステージに取り込まれ、さらに作業が行われ、他のキューに詰め込まれます。このプロセスは、さらにいくつかの段階を経て続きます。一方、最初のステージはそのスーパーバイザーによって再度呼び出され、オブジェクトを DB から引き出します。これらのオブジェクトには、まだ処理中のオブジェクトが含まれる可能性があります (処理が完了しておらず、次のように設定されたフラグで再永続化されていないため)。彼らは終わった)。
私が設計しているソリューションは、「作業中」のマスター コレクションです。オブジェクトは、最初のステージで処理のために取得されるとそのキューに入り、必要な処理を完了したワークフローのステージによって「処理済み」として DB に再保存された後に削除されます。オブジェクトがそのリストにある間、最初のステージで再取得された場合、オブジェクトは無視されます。
ConcurrentBag を使用する予定でしたが、唯一の削除方法 (TryTake) は、指定されたアイテムではなく、任意のアイテムをバッグから削除します (そして、.NET 4 ではConcurrentBag は低速です)。ConcurrentQueue と ConcurrentStack では、次に提供されるアイテム以外のアイテムを削除することもできず、ConcurrentDictionary を残します。これは機能しますが、必要以上のものです (本当に必要なのは、処理中のレコードの ID を格納することだけです。ワークフロー中に変更されません)。