限制从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的博客文章,我最终使用了GetComsumingPartitioner: https://devblogs.microsoft.com/pfxteam/parallelextensionsextras-tour-4-blockingcollectionextensions/

效果很好。

最新更新