Какая потокобезопасная коллекция подходит для этого сценария?

#.net #collections #thread-safety

#.net #Коллекции #потокобезопасность

Вопрос:

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

Обычно я бы реализовал это с помощью списка или вызова HashSet Contains перед каждой операцией, но если я хочу использовать один из новых классов в системе.Коллекции.Параллельное пространство имен, единственный вариант, который я вижу, — это использовать ConcurrentDictionary с фиктивным значением.

Это мой лучший вариант или я что-то упускаю из виду? Кстати, производительность на самом деле не является фактором, который следует учитывать.

Ответ №1:

Я думаю, вам следует придерживаться ConcurrentDictionary

Комментарии:

1. «и в отличие от наборов, пакеты поддерживают дубликаты». против «Перед добавлением или удалением класс должен проверить, что элемент еще не был добавлен или удален».

Ответ №2:

Почему вы не используете ConcurrentDictionary, поддерживаемый блокирующей очередью. BlockingQueue, похоже, соответствует вашей схеме производителя / потребителя и ConcurrentDictionary для ваших поисковых запросов.

Комментарии:

1. Я не уверен, что мой сценарий соответствует схеме производитель / потребитель. Запросы на отмену подписки не обязательно должны выполняться в том же порядке, что и запросы на подписку, поэтому я не вижу, в чем преимущество использования очереди в этом случае. Я не вижу дополнительной выгоды по сравнению с простым использованием словаря.