реализация потребителя c # с 1 синхронизированным потребителем для алгоритма массовой отправки - PullRequest
1 голос
/ 11 октября 2011

Мне нужно реализовать модуль, который может иметь несколько входов в словарь (несколько потоков, записывающих в словарь) и одного временного потребителя, который берет этот словарь, отсылает его с помощью ISender и очищает словарь для новой массы данных , проблема в том, что мне нужно спроектировать свои блокировки таким образом, чтобы поток-потребитель делал самый быстрый снимок массива, позволяя производящим потокам продолжать запись в новый очищенный словарь. Какой дизайн потребительского производителя лучше всего предложить, используя блокировки и ConcurrentDictionary?

С наилучшими пожеланиями!

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Самый быстрый способ, который я могу придумать, - это использовать несколько объектов словаря.

Когда ваш потребительский поток запускается, он создает новый ConcurrentDictionary и устанавливает его в качестве "живого" словаря.Это быстро и означает, что производители могут продолжать работу с минимальным прерыванием.

Поток потребителя теперь «владеет» предыдущим объектом словаря и может обрабатывать его содержимое в свое время.

1 голос
/ 11 октября 2011

Не позволяйте потокам производителя помещать данные в словарь напрямую.Пусть они поместят его в какую-нибудь потокобезопасную очередь, например BlockingCollection.Ваш потребительский поток может затем взять элементы из очереди, создать словарь и отправить его, и все это без блокировки потоков производителя.

По сути, выполняется та же самая работа, но она «распространяется» таким образом, что позволяет избежатьбольшая часть блокировок.

Если вас беспокоят конфликты в этой единственной очереди, вы даже можете иметь отдельный BlockingCollection для потока производителя и затем использовать BlockingCollection.TakeFromAny в качестве потребителя.


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

...