2014-10-23 4 views
1

Каков правильный способ итерации коллекции ConcurrentDictionary и удаления некоторых записей.Итерация через ConcurrentDictionary и изменение коллекции

Как я понимаю ConcurrentDictionary реализует блокировку на уровне ячейки, и для меня важно перебирать всю коллекцию и удалять нерелевантные данные через какое-то условие. Я боялся, что через мою итерацию другой поток добавит данные, которые должны быть отфильтрованы после того, как мой итератор был после этого момента в коллекции.

Так как я могу достичь этого с помощью ConcurrentDictionary, или должен использовать обычный словарь с блокирующим механизмом при каждом касании этой коллекции.

Спасибо.

ответ

1

ConcurrentDictionary Главное преимущество ИМО в том, что это lock free for the reading threads, что обычно является причиной его использования; если вам не нужно это преимущество, вы можете просто использовать словарь с блокировкой.

Вы всегда можете гарантировать, что критерии фильтра передаются на любые добавления, которые появляются после запуска итерации фильтра.

В противном случае, если неблокирующие чтения важнее случайной непоследовательной записи, вы можете просто повторить свой фильтр, пока не найдете более недействительных элементов.

0

Определенно, вы не можете гарантировать, что никакие записи не будут добавлены к ConcurrentDictionary, пока вы перебираете его без блокировки словаря. Но если делать блокировку, то нет смысла использовать ConcurrentDictionary, вместо этого используйте Dictionary.

КВт, почему для вас важно завершить итерацию без каких-либо «плохих» записей? Он может быть заполнен любым из них в следующий момент после отпускания замка. Может быть, лучше не допускать появления нежелательных записей в словаре?

+0

Это связано с внешней бизнес-логикой, за которой я должен следовать. –

+0

Итак, закройте «Словарь» и повторите его. Я не вижу других вариантов. – alpinsky

 Смежные вопросы

  • Нет связанных вопросов^_^