Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从多个线程填充列表_C#_Multithreading - Fatal编程技术网

C# 从多个线程填充列表

C# 从多个线程填充列表,c#,multithreading,C#,Multithreading,我有一个程序,screen使用HtmlAgilityPack刮取一些页面,我希望它运行得更快,因为页面的加载有时需要1-2秒。现在我有下面的代码按顺序执行 List<Projections> projectionsList = new List<Projections>(); for (int i = 532; i <= 548; i++) { doc = webGet.Load("htt

我有一个程序,screen使用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 projectionsList=new List();

for(int i=532;i例如,使用Parallel for循环来创建一个基本的并发循环。然后,每当操作列表时,确保首先锁定列表,以便其他两个线程不能同时操作它

List<Projections> projectionsList = new List<Projections>();       
Parallel.For(532, 548 + 1, i => {
    var doc = webGet.Load("http://myurl.com/projections.php?League=&Position=97&Segment=" + i + "&uid=4");
    lock (projectionsList) {
        GetProjection(doc, ref projectionsList, (i));
    }
});
List projectionsList=new List();
平行。对于(532548+1,i=>{
var doc=webGet.Load(“http://myurl.com/projections.php?League=&Position=97&Segment=“+i+”&uid=4”);
锁(项目列表){
GetProjection(文件,参考ProjectionList,(i));
}
});

我建议您使用并行。例如@Tgys,但您可以使用集合,它是线程安全的,不需要处理锁

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));
    }
});
ConcurrentBag项目列表=新建ConcurrentBag();
平行。对于(532548+1,i=>{
var doc=webGet.Load(“http://myurl.com/projections.php?League=&Position=97&Segment=“+i+”&uid=4”);
GetProjection(文件,参考ProjectionList,(i));
}
});
可能您需要更改GetProjection方法。因此,请检查我的解决方案是否符合您的需要


有关ConcurrentBag类的更多信息,请参见此。

webGet是否有异步方法?它对您有用吗?是的,但我遇到了另一个线程问题。我需要迭代2个集合,总共迭代约2.3MM,并且该过程正在进行大量(修改集合、计算)大约需要1.3个小时。我想实现Parallel.ForEach,但当我这样做时,它不会更快,因为我想象我要么做了错事,要么它不是它的用例。我给你的少量信息对此有什么想法吗?:)@isaclevin如果你的过程需要1.3个小时,这并不意味着它一定是错的。一辆普通的ForEach需要多少时间?。。。然而,你似乎有一个沉重的逻辑与这么多的任务,所以也许你可以考虑转换它在一个长期运行的过程。选中,您可以在后端触发一个进程,然后在进程完成时向用户提供反馈(可能是电子邮件或通知)。希望我的意见能对你有所帮助。这个过程是同时进行的,每个人都很简单,所以它似乎不能正常工作。我会看一看hangfire.io,但如果可能的话,我想让流程更快速。@IsaacLevin另一个建议:如果您可以在不同的步骤中进行流程,请查看生产者/消费者模式。您可以使用BlockingCollection类在.NET中实现它:。这也是同时执行一些并行任务的一种方法。然而,这在很大程度上取决于你需要什么,所以你必须对它进行评估。检查一下,如果可以的话试试。当做