2

我有一个字符串列表,我需要将其传递给不同类中的进程。我想知道这两种想法中的哪一种在速度、效率和并行处理方面更适合使用。该列表包含 +- 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

任何想法表示赞赏。

4

2 回答 2

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类内的分区将重用任务,并防止发生过度调度。它还将使用当前线程进行一些处理,而不是强制它进入等待状态,这也将减少所涉及的总开销。

于 2012-03-22T17:29:28.167 回答
2

如果我是你,我不会太担心正在使用多少线程(除非你能证明这是一个问题)。只需使用 aParallel.ForEach并让运行时计算出最佳线程数。

查看这个问题的答案,了解运行时如何为您管理线程的一些详细信息。

于 2012-03-22T17:33:26.623 回答