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

duanxz 阅读:11 2024-02-23 17:27:14 评论:0

我有一个字符串列表,需要传递给不同类中的进程。我想知道在速度、效率和并行处理方面,这两个想法中的哪一个是更好的使用方法。该列表包含 +- 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 类中的分区将重用任务,并防止发生过度调度。它还将使用当前线程进行某些处理,而不是强制其进入等待状态,这也将减少所涉及的总开销。


标签:多线程
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号