Когда у меня есть несколько потоков, которые должны работать одновременно с коллекцией, я обычно использую коллекции под номером System.Collections.Concurrent
.
Однако эти коллекции дороже по сравнению с их несогласованными аналогами. Интересно, могу ли я в некоторых случаях безопасно заменить их не совпадающими коллекциями.Когда я могу заменить параллельную коллекцию на стандартную коллекцию?
Например, предположим, что у меня есть словарь, который я сначала заполняю данными, а позже я создаю несколько потоков (или задач), которые только читают или проверяют только, существует ли ключ, но никогда не пишите или изменить его.
В таком случае было бы безопасно использовать Dictionary<TKey, TValue>
, или мне еще нужно использовать ConcurrentDictionary<TKey, TValue>
?
И в общем случае могу ли я предположить, что все стандартные коллекции поддерживают несколько считывателей, пока коллекция не изменяется?
Является ли общим правилом для всех коллекций, что мы можем иметь несколько параллельных считывателей, если мы не модифицируем коллекцию? Или это специальное свойство словаря '? –
@AmirGonnen: Это, по крайней мере, очень распространено. Это стоит проверить, но наиболее распространенные коллекции в .NET имеют это свойство. –
Хорошо, давайте возьмем 'HashSet' например. В документации ничего не говорится об этом. Имеет ли смысл предполагать, что это работает как «Словарь », и допускаются одновременные чтения? –