Выполняется ли литье из ConcurrentDictionary в IDictionary в потокобезопасной реализации, поскольку IDictionary не имеет методов GetOrAdd и AddOrUpdate?В ролях из ConcurrentDictionary для IDictionary
ответ
Результирующий объект по-прежнему будет параллельным словарем. Такие вызовы, как «Добавить или удалить», используют базовую реализацию TryAdd и TryRemove (которые являются потокобезопасными). Отбрасывание объекта другим типом не изменяет сам объект.
Кроме того, для разъяснения вы можете использовать такие инструменты, как ILSpy, чтобы узнать, что представляет собой реализация методов IDictionary по умолчанию и будут ли они по-прежнему безопасными для потоков.
Вы также можете посмотреть документацию MSDN для реализации ConcurrentDictionary методов 'IDictionary
IDictionary
- это просто интерфейс. Если вы примените его, результатом будет реализация ConcurrentDictionary, отсутствующие методы GetOrAdd
и AddOrUpdate
.
Предположительно, вы все еще можете использовать Item
собственность и Add
и ContainsKey
методы (вместо из GetOrAdd
и AddOrUpdate
) методы, и ваш отливают объект все еще будет поточно-(так как лежащая в основе реализация является ConcurrentDictionary
).
Было бы похоже на большой ConcurrentDictionary
объект через IDictionary
в форме замочной скважины - вы могли видеть только IDictionary
форму, но он все равно будет ConcurrentDictionary
.
Короткий ответ №.
Вы управляете объектом через интерфейс и, следовательно, все еще используете конкретную реализацию. Вы не теряете никакой функциональности и своих методов. Они просто недоступны.
На стороне примечания, вам нужно явное приведение при понижении, без необходимости явного приведения при повышении - всегда безопасно это делать.
извините, но ConcurrentDictionary добавляет два новых методы и скрывать другие, поэтому его реализация может добавить потокобезопасность только для новых методов, а не для скрытых методов. Документация MSDN не уточняет, поэтому я спросил об этом.Но после того, как я прочитал лучшие комментарии, и я взглянул на прототип ConcurrentDictionary, я увидел, что он не расширяет словарь, и это заверило меня, что маловероятно, что его использование в IDictionary косвенно будет использовать словарь расширенной версии. – Luciano
- 1. Зачем мне нужно отбрасывать из ConcurrentDictionary в IDictionary, чтобы использовать Add()?
- 2. Заполнять ConcurrentDictionary из Словаря
- 3. Лучший способ перевести из IDictionary в общий IDictionary
- 4. В ролях Модель для ViewModel
- 5. DataGridTextColumn Связующие для IDictionary
- 6. GetEnumerator для реализации IDictionary
- 7. В ролях [Int] - [Word8]
- 8. Обновление списка в ConcurrentDictionary
- 9. В ролях управления TextBox из Linq запроса
- 10. Перечислителей В ролях
- 11. Вложенный ConcurrentDictionary
- 12. ConcurrentDictionary в MonoTouch
- 13. Создайте linq-адаптер для Idictionary
- 14. Какие члены ConcurrentDictionary .NET являются потокобезопасными?
- 15. TypeLoadException в ролях
- 16. CircularBuffer IDictionary в C#?
- 17. Deserialise XML в IDictionary
- 18. Доступ к ConcurrentDictionary в деструкторе
- 19. ConcurrentDictionary как статический кеш
- 20. В ролях Enum для IEnumerable байт
- 21. Безопасное удаление отображение списка из ConcurrentDictionary
- 22. Обновление полей значений в ConcurrentDictionary
- 23. , переводящий concurrentdictionary в другой метод
- 24. Гарантирован порядок списка в ConcurrentDictionary?
- 25. В ролях UINT к Int32
- 26. IDictionary в SelectList?
- 27. C# ConcurrentDictionary против ManualResetEvent для контроля резьбы
- 28. ConcurrentDictionary: супер медленный?
- 29. Как преобразовать ConcurrentDictionary в словарь?
- 30. В ролях uint64_t к FileTime
Как вы имеете в виду «вырезать», точно? Удаляет ли это его из 'ConcurrentDictionary'? Нет. Доступно ли это из интерфейса IDictionary? № –
@JamesMichaelHare: Он означает, что, если вы нажмете на 'IDictionary', делает ли этот объект потоком-небезопасным? Другими словами, превращает ли он его в обычный словарь? –
Будет ли он по-прежнему быть потокобезопасным? Да, поскольку это может быть без этих операций. То есть, если вам нужен атомный 'GetOrAdd()' вам не повезет. –