2011-10-10 69 views
1

我需要实现一个模块,可以有多个输入到字典(多个线程写入字典)和1定时使用此字典,将它发送使用一些ISender并清除字典以获得新的批量数据。 问题是,我需要设计我的联锁,使消费线程获得批量最快的快照,同时允许生成线程继续写入新的已清除字典。 什么是最好的消费者生产者设计,你会建议使用联锁和ConcurrentDictionary?消费者生产者c#实现与1定时消费者的批量发送算法

最好的问候!

回答

1

不要让生产者线程直接将数据放到字典中。让他们把它放在一些线程安全的队列中,比如BlockingCollection。然后,消费者线程可以从队列中取出项目,构建字典并将其发送出去,而不会阻塞生产者线程。

基本上完成了同样的工作,但是以避免大部分阻塞的方式“散布”。

如果您担心该单个队列上的争用,您甚至可以为每个生产者线程单独制作BlockingCollection,然后在消费者中使用BlockingCollection.TakeFromAny


问题是,当然,如果您的消费者线程做任何事情,而不是简单地写入字典。例如,如果他们需要检查给定的键是否已经存在于字典中,那么这种设计突然变得更加复杂。

1

我能想到的最快方法是使用多个字典对象。

当您的消费者线程运行时,它会创建一个新的ConcurrentDictionary并将其设置为“实时”字典。这很快,意味着制片人可以进行最少的中断。

消费者线程现在“拥有”了以前的字典对象,并且可以在自己的时间处理其内容。