我有一个需要传递给不同类中的进程的字符串列表。我想知道在速度,效率和并行处理方面,这两种想法中的哪一种是更好的使用方法。该列表包含+-10000个字符串,我想将线程适当地限制为一次仅运行约5个线程:

For i as integer = 0 to searchPages.Count - 1
    Parallel.For(0,10,Sub(x)
                        ps.processPage(searchPages.Item(i))
                 End Sub)
Next

任务工厂似乎工作正常,但不确定要实现哪个。
For i as integer = 0 to searchPages.Count - 1
    Dim fact as Task=Task.Factory.StartNew(Sub() ps.processPage(searchPages.Item(i)))
    If i = 11 then
           Tasks.Task.WaitAll()
    Endif

Next

任何想法表示赞赏。

最佳答案

对于这种类型的纯数据并行性,我建议使用Parallel.ForEach:

Parallel.ForEach(searchPages, Sub(page) ps.processPage(page))

如果您想限制它使用5个线程,可以通过ParallelOptions.MaxDegreeOfParallelism来实现:
Dim po as New ParallelOptions
po.MaxDegreeOfParallelism = 5
Parallel.ForEach(searchPages, po, Sub(page) ps.processPage(page))

这将比Task.Factory.StartNew少开销,因为Parallel类内的分区将重用Tasks,并防止发生过度调度。它还将使用当前线程进行某些处理,而不是将其强制进入等待状态,这还将减少涉及的总开销。

09-10 07:46