#.net #collections #thread-safety
#.net #Коллекции #потокобезопасность
Вопрос:
У меня есть одноэлементный класс, обрабатывающий запросы на подписку и отмену подписки от разных клиентов, работающих в разных потоках. Синглтон содержит коллекцию подписчиков. Перед добавлением или удалением класс должен проверить, что элемент еще не был добавлен или удален.
Обычно я бы реализовал это с помощью списка или вызова HashSet Contains перед каждой операцией, но если я хочу использовать один из новых классов в системе.Коллекции.Параллельное пространство имен, единственный вариант, который я вижу, — это использовать ConcurrentDictionary с фиктивным значением.
Это мой лучший вариант или я что-то упускаю из виду? Кстати, производительность на самом деле не является фактором, который следует учитывать.
Ответ №1:
Я думаю, вам следует придерживаться ConcurrentDictionary
…
Комментарии:
1. «и в отличие от наборов, пакеты поддерживают дубликаты». против «Перед добавлением или удалением класс должен проверить, что элемент еще не был добавлен или удален».
Ответ №2:
Почему вы не используете ConcurrentDictionary, поддерживаемый блокирующей очередью. BlockingQueue, похоже, соответствует вашей схеме производителя / потребителя и ConcurrentDictionary для ваших поисковых запросов.
Комментарии:
1. Я не уверен, что мой сценарий соответствует схеме производитель / потребитель. Запросы на отмену подписки не обязательно должны выполняться в том же порядке, что и запросы на подписку, поэтому я не вижу, в чем преимущество использования очереди в этом случае. Я не вижу дополнительной выгоды по сравнению с простым использованием словаря.