несколько потоков, мне нужно застраховаться от дублирования записей.
Пишут что ConcurrentBag не покатит для этих целей, т.к. пока я проверяю есть ли элемент в коллекции, другой может, в этот момент, записать значение.
Как поступить в данном случае? Есть смысл юзать, например, ConcurrentDictionary — только ключи, а на значения забить, например <int, bool>?
Может поможет blocking Collection?
Да, тоже смотрел, не знаю как элегантно выйти из ситуации.
Hashset с lock?
Либо
Хм, в эту сторону не смотрел. Смотрел в строну самопального листа с локами
Можно сделать double check lock. Проверить есть ли дубликат, если нету, то повесить лок, проверить ещё раз под локом. Если и во второй раз нет - можно спокойно добавлять (внутри того же лока). Получается простенький read-write lock Но только проверки будут, вроде как, линейные, ибо это не hashset. Если это критично, то hashset с иоками или таки concurrent dictionary.
Спасибо! Сложный выбор, есть что почитать/посмотреть перед сном)
Ну, можем чатиком помочь =) Насколько часто чтения из этой коллекции? Порядок важен? Как часто запись? Как часто попытки записи дубликатов?
Это набор айдишников для кешей изображений, для респонса. Порядок, соответственно не важен совсем. По сути операции 3: add, contains, clear
Веб приложение? Может быть memory cache тогда? Если нет, то hashset с ReaderWriterLockSlim выглядит более подходящим вариантом. Если там асинхронный код, то тогда надо взять AsyncReaderWriterLock из этого пакета, ибо системный гвоздями прибит к id потоков. https://github.com/microsoft/vs-threading
Реализация своя. Веб приложение, да.
Интересна ссылка, схоронил.
Если кому интересно, вот что ещё нашлось по вопросу: https://stackoverflow.com/questions/18922985/concurrent-hashsett-in-net-framework
Обсуждают сегодня