2017-02-02 1 views
7

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

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

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

+0

Итак, просмотрев информацию по каждому из этих объектов индивидуально, как это не могло ответить на ваш вопрос о том, когда вы должны использовать их? Если вы знаете, когда вы должны использовать «Словарь», и когда вы должны использовать «ConcurrentDictionary», учитывая, что вы говорите, что уже нашли эту информацию, тогда вы знаете, когда вы должны использовать один над другим. – Servy

+0

Название типа объясняет это сам.Вы используете «ConcurrentDictionary», когда вам нужен параллельный доступ к словарю. –

+0

использовать ConcurrentDictionary, если вы будете получать доступ к словарю из нескольких потоков. Это то, что используется для всего пространства имен System.Collections.Concurrent' для – Jonesopolis

ответ

15

«Использовать 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. При этом теоретически у вас могут быть блокировки для предотвращения параллельного доступа к словарю; Этот вопрос уже указан в "Dictionary locking vs. ConcurrentDictionary".

+1

Спасибо за ответ, это очень помогло. Будет ли использовать ConcurrentDictionary везде, даже если его выход из одного потока будет такой плохой? – Ashkru

+1

Можете ли вы использовать неконкурентную форму, если вы пишете до создания потоков (одна многопоточность, только чтение)? Я бы предположил, что это быстрее и не может понять, как это может сломаться (пока вы не сделаете что-то глупое, как напишите на него). –

+0

Вероятно, нет проблем с использованием 'ConcurrentDictionary', но я полагаю, что по крайней мере некоторые накладные расходы могут быть узким местом в зависимости от того, как используется словарь. Если вы хотите сравнить источник, чтобы узнать, что происходит, проверьте источник для [ConcurrentDictionary.TryAddInternal()] (https://referencesource.microsoft.com/#mscorlib/system/Collections/Concurrent/ConcurrentDictionary.cs, bc495056297a0851) и [Dictionary.Insert()] (https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,fd1acf96113fbda9). –

0

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

+0

Будет ли использовать ConcurrentDictionary везде, даже если его появление из одного потока будет такой плохой? – Ashkru

+0

Нет, потому что вы путаете кого-либо, читающего ваш код позже, если вы не планируете многопоточность своей программы. Кроме того, я ожидал бы некоторые дополнительные накладные расходы в любой параллельной структуре данных, потому что права доступа должны управляться через несколько потоков. – Woody1193

+0

Вы говорите, что нет, тогда продолжайте, как это плохо, это плохо? Причина, по которой я спрашиваю, заключается в том, что в настоящее время он не получает доступа из других потоков, кроме основного потока, но в будущем. Стоит ли просто использовать Concurrent для обработки всех способов или изменения моего кода, если я решаю реализовать многопоточность? – Ashkru

0

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

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