我需要实现一个模块,该模块可以对字典有多个输入(多个线程写入字典)和 1 个定时消费者,该消费者使用该字典,使用一些 ISender 将其发送出去,并为新的大量数据清除字典。问题是我需要以这样的方式设计我的互锁,即消费线程拍摄批量的最快快照,同时允许生产线程继续写入新的已清除字典。您建议使用联锁和 ConcurrentDictionary 的最佳消费者生产者设计是什么?
此致!
我需要实现一个模块,该模块可以对字典有多个输入(多个线程写入字典)和 1 个定时消费者,该消费者使用该字典,使用一些 ISender 将其发送出去,并为新的大量数据清除字典。问题是我需要以这样的方式设计我的互锁,即消费线程拍摄批量的最快快照,同时允许生产线程继续写入新的已清除字典。您建议使用联锁和 ConcurrentDictionary 的最佳消费者生产者设计是什么?
此致!
不要让生产者线程直接将数据放入字典中。让他们把它放在一些线程安全的队列中,例如BlockingCollection
. 然后,您的消费者线程可以从队列中获取项目,构建字典并将其发送出去,所有这些都不会阻塞生产者线程。
基本上完成了相同的工作,但以一种避免大部分阻塞的方式“传播”。
如果您特别担心单个队列上的争用,您甚至可以有一个单独的BlockingCollection
每个生产者线程,然后BlockingCollection.TakeFromAny
在消费者中使用。
当然,问题在于,如果您的消费者线程除了简单地写入字典之外还做其他事情。例如,如果他们需要检查给定键是否已经存在于字典中,那么这种设计突然变得更加复杂。
我能想到的最快方法是使用多个字典对象。
当您的消费者线程运行时,它会创建一个新的ConcurrentDictionary
并将其设置为“实时”字典。这很快,意味着生产者可以在最少的干扰下继续进行。
消费者线程现在“拥有”前一个字典对象,并且可以在自己的时间处理其内容。