Параллельная коллекция, поддерживающая удаление указанного элемента?

Довольно просто :Кроме ConcurrentDictionary (, который я буду использовать, если понадобится, но это не совсем правильная концепция ), существует ли какая-либо параллельная коллекция (реализация IProducerConsumer ), которая поддерживает удаление определенных элементов на основе простого равенства элемента или предиката, определяющего условие удаления?

Объяснение :У меня есть многопоточный -многопоточный алгоритм многоэтапного -рабочего процесса, который извлекает объекты из БД и помещает их в "стартовую" очередь. Оттуда они перехватываются следующим этапом, обрабатываются и помещаются в другие очереди. Этот процесс продолжается еще через несколько стадий. Тем временем первый этап снова вызывается его супервизором и вытаскивает объекты из БД,и они могут включать объекты, все еще находящиеся в процессе (, потому что они еще не закончили обработку и поэтому не были повторно -сохранены с установленным флагом, указывающим, что они завершены ).

Решение, которое я разрабатываю, представляет собой основную коллекцию «в работе»; объекты помещаются в эту очередь, когда они извлекаются для обработки на первом этапе, и удаляются после повторного -сохранения в БД как "обработанные" любым этапом рабочего процесса, завершившим необходимую обработку. Пока объект находится в этом списке, он будет проигнорирован, если -будет повторно получен на первом этапе.

Я планировал использовать ConcurrentBag, но единственный метод удаления (TryTake )удаляет произвольный элемент из пакета, а не указанный (, а ConcurrentBag медленный в.NET 4 ). ConcurrentQueue и ConcurrentStack также не позволяют удалять элемент, кроме следующего, который он вам даст, оставляя ConcurrentDictionary, который будет работать, но это больше, чем мне нужно (все, что мне действительно нужно, это сохранить идентификатор записей, которые обработанный; они не меняются во время рабочего процесса ).

21
задан KeithS 27 July 2012 в 21:31
поделиться