ConcurrentDictionary должен работать для вас. Он не блокируется, но не блокирует весь хэш, за исключением определенных ситуаций.
Он использует две коллекции: массив блокировок и коллекцию хэш-блоков.
Количество блоков блокировок можно контролировать, задавая уровень параллелизма, а начальное количество блоков хешей можно контролировать, задавая начальную емкость. (оба являются параметрами конструктора).
Каждый сегмент массива блокировок покрывает несколько (ну, по крайней мере, один действительно) хеш-блоков, используя простой хеш по модулю.
Единственный раз, когда параллельный словарь блокирует все блоки блокировки:
- При изменении размера хэш-блоков.
- При чтении публичного свойства ключей.
- При чтении общедоступных значений Property.
- При чтении общедоступных графов собственности.
- При чтении публичного свойства IsEmpty.
- При вызове Clear ().
- При сериализации.
За исключением изменения размера их легко избежать.
Изменение размера можно избежать, если вы можете предсказать максимальное количество элементов в словаре.