我有一个程序可以使用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

10-04 17:30