Довольно просто: кроме ConcurrentDictionary (который я буду использовать, если нужно, но это не совсем правильная концепция), существует ли какая-либо параллельная коллекция (реализация IProducerConsumer), которая поддерживает удаление определенных элементов на основе простого равенства элемента или предикат, определяющий условие для удаления?
Объяснение: У меня многопоточный многоступенчатый алгоритм рабочего процесса, который вытягивает объекты из БД и вставляет их в "стартовую" очередь. Оттуда они захватываются следующим этапом, дальше работают и набиваются в другие очереди. Этот процесс продолжается еще на нескольких этапах. Между тем, первый этап снова запускается его супервизором и вытаскивает объекты из БД, и они могут включать объекты, все еще находящиеся в процессе (потому что они еще не закончили обрабатываться и поэтому не были повторно сохранены с установленным флагом, говорящим они сделаны).
Решение, которое я разрабатываю, является коллекцией мастеров "в работе"; объекты попадают в очередь, когда они извлекаются для обработки на первом этапе, и удаляются после того, как они были повторно сохранены в БД как "обработанные" на каком-либо этапе рабочего процесса, завершили необходимую обработку. Пока объект находится в этом списке, он будет проигнорирован, если он будет повторно извлечен на первом этапе.
Я планировал использовать ConcurrentBag, но единственный метод удаления (TryTake) удаляет произвольный элемент из пакета, а не указанный (и ConcurrentBag медленнее в .NET 4). ConcurrentQueue и ConcurrentStack также не позволяют удалить элемент, отличный от следующего, который он вам даст, оставив ConcurrentDictionary, который будет работать, но больше, чем мне нужно (мне действительно нужно хранить Id обрабатываемых записей; они не меняются во время рабочего процесса).