多线程进程中的parallel.for或task.startnew

vbN*_*bie 2 .net vb.net visual-studio-2010 task-parallel-library taskfactory

我有一个字符串列表,我需要传递给另一个类中的进程.我想知道这两个想法中哪一个更适合在速度,效率和并行处理方面使用.该列表包含+ - 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
Run Code Online (Sandbox Code Playgroud)

任务工厂似乎工作正常但不确定要实施哪个.

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
Run Code Online (Sandbox Code Playgroud)

任何想法都赞赏.

Ree*_*sey 6

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

Parallel.ForEach(searchPages, Sub(page) ps.processPage(page))
Run Code Online (Sandbox Code Playgroud)

如果要将此限制为使用5个线程,可以通过ParallelOptions.MaxDegreeOfParallelism执行此操作:

Dim po as New ParallelOptions
po.MaxDegreeOfParallelism = 5
Parallel.ForEach(searchPages, po, Sub(page) ps.processPage(page))
Run Code Online (Sandbox Code Playgroud)

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