我有一个字符串列表,我需要传递给另一个类中的进程。我想知道这两个想法中哪一个更适合在速度,效率和并行处理方面使用。该列表包含+ - 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
任何想法都赞赏。
答案 0 :(得分:6)
对于这种纯数据并行,我建议使用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
类中的分区将重用任务,并防止发生过度调度。它还将使用当前线程进行某些处理,而不是强制它进入等待状态,这也将减少所涉及的总开销。
答案 1 :(得分:2)
如果我是你,我不会过分担心使用了多少线程(除非你能证明这是一个问题)。只需使用Parallel.ForEach
,让运行时计算出最佳线程数。
查看this问题的答案,了解有关如何为运行时管理线程的一些详细信息。