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