微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 BlockingCollection 出队时限制线程数

如何解决从 BlockingCollection 出队时限制线程数

我目前正在使用它来限制处理线程的数量

Dim listofFiles New List(of String) From {...}
Dim parallelOptions As ParallelOptions = New ParallelOptions With {.MaxDegreeOfParallelism = 6}
Parallel.ForEach(listofFiles,parallelOptions,Sub(F)
                                                    'Process one file
                                               End Sub)

效果很好,因为我可以控制并发线程的数量以适应同时进行的其他处理。

但我需要不断向列表中添加项目。我想使用 ConcurrentQueue 而不是固定大小的列表,这样我就可以在并行消费者处理正在进行时继续将文件列表(来自生产者线程)排队。显然 Parallel.ForEach 行不通。我可以使用 BlockingCollection 但我无法确定如何最好地仅在线程可用时出列项目并在它们都忙时阻塞。坐在一个循环中并计算线程数似乎很丑陋。

欢迎提出任何想法。

解决方法

感谢所有评论者。

我最终根据 Stephen Toub 的博客文章使用了 GetComsumingPartitionerhttps://devblogs.microsoft.com/pfxteam/parallelextensionsextras-tour-4-blockingcollectionextensions/

效果很好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。