如何使用 BlockingCollection 拥有许多使用者线程



我正在使用由BlockingCollection支持的生产者/消费者模式从文件中读取数据,解析/转换,然后插入到数据库中。我拥有的代码与此处的代码非常相似:http://dhruba.name/2012/10/09/concurrent-producer-consumer-pattern-using-csharp-4-0-blockingcollection-tasks/

但是,主要区别在于我的使用者线程不仅解析数据,而且还插入到数据库中。这个位很慢,我认为导致线程阻塞。

在示例中,有两个使用者线程。我想知道是否有办法以某种智能的方式增加线程数?我曾以为线程池会做到这一点,但似乎无法理解如何做到这一点。

或者,您将如何选择使用者线程的数量? 2 对我来说似乎不正确,但我不确定最好的 # 是什么。关于选择 # 个消费者线程的最佳方式的想法?

选择消费者线程数的最佳方法是数学:计算出每分钟有多少数据包来自生产者,除以单个消费者每分钟可以处理多少数据包,你就很清楚你需要多少消费者。

我通过添加另一个使用者放入已完成数据包的BlockingCollection解决了阻塞输出问题(使用者在尝试更新数据库时阻塞(。一个单独的线程读取该队列并更新数据库。所以它看起来像:

input thread(s) => input queue => consumer(s) => output queue => output thread

这具有将使用者与输出分离的额外好处,这意味着您可以优化输出或完全更改输出方法,而不会影响使用者。例如,这可能允许您对数据库更新进行批处理,以便您可以通过一次调用更新十几条或一百条(或更多(条记录,而不是对每条记录进行一次数据库调用。

我在我的文章简单多线程,第 2 部分中展示了一个非常简单的示例(使用单个使用者(。这适用于文本文件过滤器,但概念是相同的。

最新更新