从 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/

效果很好。