C#从巨大的URL列表中下载数据有些网址在同一网站内,有些网址在另一个网站上。现在我正在尝试使用下面的代码并行执行此操作,但我觉得我造成了太多开销。while(ListOfUrls.Count>0){Parallel.ForEach(ListOfUrls,url=>{WebClientwebClient=newWebClient();webClient.DownloadString(url);...在这里运行我的检查..});ListOfUrls=GetNewUrls。....}这是否可以通过更少的开销和更多地控制我使用/重用的Web客户端和连接数来完成?那么,最终能否更快地完成这项工作呢?Parallel.ForEach适用于受CPU限制的计算任务,但在您的情况下,同步IO限制调用(如DownloadString)不需要池化线程。通过将DownloadStringTaskAsync与任务结合使用,您可以提高代码的可扩展性并减少可能使用的线程数://非阻塞异步方法asyncTaskProcessUrlAsync(stringurl){using(varwebClient=newWebClient()){stringdata=awaitwebClient.DownloadStringTaskAsync(newUri(url));//在这里运行检查..返回数据;}}//...if(ListOfUrls.Count>0){vartasks=newList();foreach(ListOfUrls中的varurl){tasks.Add(ProcessUrlAsync(url));}Task.WaitAll(tasks.ToArray());//阻塞等待//可以在这里使用await并使这个方法异步://awaitTask.WhenAll(tasks.ToArray());您可以尝试在.Net4.5中使用HttpClient的新功能,它认为它更快并且可以提高您的性能(HttpContentcontent=response.Content){stringresult=awaitcontent.ReadAsStringAsync();应用程序的web.config或app.config文件中经常被忽视的元素是connectionManagement标记。特别是,.NET默认将域的同时连接数限制为2。您可以在此处查看标记的文档。如果我正确理解你的问题,默认情况下并行创建2个域的Web客户端将被限制为4个线程(每个域2个线程),导致加速比你预期的要少。但是,如果您连接到多个域,那么其他答案可能会产生更多的加速,因为等待响应可能是每个循环迭代成本的很大一部分。如果您使用的是.NET4.5,则GetStringAsync方法可能是您的好帮手。您是否考虑过代码的异步执行?我不认为有更快的方法从Internet获取数据,但您可以两者兼顾。以上就是C#学习教程:C#从一个巨大的url列表中下载数据分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
