为批量发送算法提供一个定时消费者的c#实现

本文关键字:一个 定时 消费者 实现 算法 | 更新日期: 2023-09-27 18:10:49

我需要实现一个模块,该模块可以有多个输入到字典(多个线程写入字典)和一个定时消费者,该消费者接受该字典,使用一些ISender将其发送出去,并清除字典中的新数据块。问题是,我需要设计我的联锁,使消费线程以最快的速度获取批量快照,同时允许生产线程继续写入新的已清除的字典。你认为使用interlocks和ConcurrentDictionary的最佳消费者生产者设计是什么?

致以最亲切的问候!

为批量发送算法提供一个定时消费者的c#实现

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

基本上完成了相同的工作,但以一种避免大多数阻塞的方式"分散"。

如果你特别担心单个队列上的争用,你甚至可以在每个生产者线程上有一个单独的BlockingCollection,然后在消费者线程中使用BlockingCollection.TakeFromAny


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

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

当您的消费者线程运行时,它创建一个新的ConcurrentDictionary并将其设置为"活动"字典。这是快速的,意味着生产者可以在最小的中断下继续进行。

消费者线程现在"拥有"前一个字典对象,并且可以在自己的时间内处理它的内容。