从 BlockingCollection 出队时限制线程数
Limiting number of threads when dequeuing from a 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/
效果很好。
我目前正在使用它来限制处理线程的数量:
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/
效果很好。