我有一个程序可以使用HtmlAgilityPack屏幕抓取少量页面,并且我希望它运行得更快,因为页面的加载有时可能需要1-2秒。现在,我有下面的代码按顺序执行。
List<Projections> projectionsList = new List<Projections>();
for (int i = 532; i <= 548; i++)
{
doc = webGet.Load("http://myurl.com/projections.php?League=&Position=97&Segment=" + i + "&uid=4");
GetProjection(doc, ref projectionsList, (i));
}
基本上,我希望将循环内的代码分解为多个线程,并等待所有线程完成后再执行。我希望列表完成后就可以填充了。我意识到List并不是线程安全的,但是我有点想弄清楚该如何解决。
最佳答案
我建议您使用Parallel.For作为@Tgys的示例,但是您可以使用ConcurrentBag集合,该集合是线程安全的,不需要处理锁。
ConcurrentBag<Projections> projectionsList = new ConcurrentBag<Projections>();
Parallel.For(532, 548 + 1, i => {
var doc = webGet.Load("http://myurl.com/projections.php?League=&Position=97&Segment=" + i + "&uid=4");
GetProjection(doc, ref projectionsList, (i));
}
});
可能您需要更改GetProjection方法。因此,请检查我的解决方案是否满足您的需求。
有关ConcurrentBag类的更多信息,请参见link。