Когда следует использовать ConcurrentDictionary и Dictionary?

Я всегда смущаюсь, какой из них выбрать. Как я вижу, я использую Dictionary over List если мне нужны два типа данных в качестве Key и Value поэтому я могу легко найти значение по его key но я всегда смущен, если я должен использовать ConcurrentDictionary или Dictionary?

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

Я попросил друга об этом раньше, но все, что они сказали, это: "используйте ConcurrentDictionary если вы много используете словарь в коде", и я не очень хотел их приставать, чтобы объяснить его более подробно. Может ли кто-нибудь расширить это?

Ответ 1

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

ConcurrentDictionary является основным для использования в среде, где вы обновляете словарь из нескольких потоков (или асинхронных задач). Вы можете использовать стандартный Dictionary из такого количества кода, сколько хотите, если он из одного потока;)

Если вы посмотрите на методы в ConcurrentDictionary, вы увидите некоторые интересные методы, такие как TryAdd, TryGetValue, TryUpdate и TryRemove.

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

// There are better ways to do this... but we need an example ;)
if (!dictionary.ContainsKey(id))
    dictionary.Add(id, value);

У этого есть проблема в том, что между проверкой того, содержит ли он ключ и вызывает ли Add другой поток, можно вызвать Add с тем же id. Когда этот поток вызывает Add, он выдает исключение. Метод TryAdd обрабатывает это для вас и вернет true/false, сообщив вам, добавило ли он его (или этот ключ уже был в словаре).

Поэтому, если вы не работаете в многопоточном разделе кода, вы, вероятно, можете просто использовать стандартный класс Dictionary. При этом теоретически у вас могут быть блокировки для предотвращения параллельного доступа к словарю; этот вопрос уже указан в разделе "Блокировка словаря против ConcurrentDictionary".

Ответ 2

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

Ответ 3

Самая большая причина использования CocurrentDictionary по Dictionary - безопасность потоков. Если ваше приложение будет получать несколько потоков, используя один и тот же словарь одновременно, вам нужен потокобезопасный CocurrentDictionary это особенно верно, когда эти потоки пишут или CocurrentDictionary словарь.