Итерация по ConcurrentDictionary и изменение коллекции
Как правильно перебрать коллекцию ConcurrentDictionary и удалить некоторые записи.
Насколько я понимаю, ConcurrentDictionary реализует блокировку на уровне ячейки, и для меня важно выполнить итерацию всей коллекции и удалить ненужные данные с помощью некоторого условия. Я боюсь, что через мою итерацию другой поток добавит данные, которые должны быть отфильтрованы после того, как мой итератор был после этой точки в коллекции.
Итак, как я могу добиться этого с ConcurrentDictionary или использовать обычный словарь с механизмом блокировки при каждом касании этой коллекции.
Благодарю.
2 ответа
ConcurrentDictionary
Главное преимущество IMO заключается в том, что он не блокируется для потоков чтения, поэтому обычно вы его используете; если вам не нужно это преимущество, тогда вы можете просто использовать словарь с блокировкой.
Вы всегда можете убедиться, что критерии фильтра переданы любым добавлениям, которые происходят после начала итерации фильтра.
В противном случае, если неблокирующие чтения более важны, чем случайные противоречивые записи, вы можете просто повторить фильтр, пока он не найдет больше недопустимых элементов.
Определенно, вы не можете гарантировать, что ни одна запись не будет добавлена в ConcurrentDictionary
пока вы повторяете это без блокировки словаря. Но если сделать блокировку, то нет смысла в использовании ConcurrentDictionary
использовать Dictionary
вместо.
Кстати, почему для вас важно завершить итерацию без "плохих" записей? Он может быть заполнен любым из них в следующий момент после снятия блокировки. Может быть, лучше не допускать появления нежелательных записей в словаре?