【问题标题】:consumer producer c# implementation with 1 timed consumer for a bulk sending algorithm消费者生产者 c# 实现,具有 1 个定时消费者,用于批量发送算法
【发布时间】:2011-10-11 16:26:09
【问题描述】:

我需要实现一个模块,该模块可以对字典有多个输入(多个线程写入字典)和 1 个定时消费者,该消费者获取该字典,使用一些 ISender 将其发送出去,并清除字典以获取新的大量数据. 问题是我需要以这样的方式设计我的互锁,即消费线程拍摄批量的最快快照,同时允许生产线程继续写入新的已清除字典。 您建议使用联锁和 ConcurrentDictionary 的最佳消费者生产者设计是什么?

最好的问候!

【问题讨论】:

    标签: c# multithreading bulk consumer producer


    【解决方案1】:

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

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

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


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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多