所以我试图查询可通过HTTP访问的API(无需授权)。为了加快速度,我尝试使用Parallel.ForEach循环,但似乎运行的时间越长,弹出的错误就越多。
无法检索越来越多的请求。我知道API提供商并没有限制我,因为我可以在我的Internet浏览器中请求相同的阻止URL。此外,每次都是不同的失败网址,因此似乎不是格式错误的请求。
使用单线程foreach循环时似乎没有出现错误。
我的故障循环如下:
Parallel.ForEach(this.urlArray, singleUrl => {
this.apiResponseBlob = new System.Net.WebClient ().DownloadString(singleUrl );
this.responsesDictionary.Add(singleUrl, apiResponseBlob);
}
正常的foreach循环工作正常,但速度很慢:
foreach (string singleUrl in this.urlArray) {
this.apiResponseBlob = new System.Net.WebClient ().DownloadString(singleUrl);
this.responsesDictionary.Add(singleUrl, apiResponseBlob);
}
另外:我在PHP中有一个解决方案 - 我同时产生了几个“取材器”,它从未挂断。我觉得奇怪的是,PHP会比C#更好地处理多线程检索,所以我显然必须错过一些东西。
如何以最快的方式查询API?没有这些奇怪的失败?
答案 0 :(得分:2)
您好,您是否尝试使用此问题中的同步下载来加速您的代码(请参阅标记答案):
DownloadStringAsync wait for request completion
你可以遍历你的uris并获得每次成功下载的回调。
编辑:我看到你使用this.apiResponseBlob = DL
当你使用多线程时,每个线程都试图写入该变量。这可能是你的错误的原因。尝试使用该对象类型的实例或使用
lock{}
这样一次只有一个线程可以写这个变量。 http://msdn.microsoft.com/de-de/library/c5kehkcz.aspx
像
Parallel.ForEach(this.urlArray, singleUrl => {
var apiResponseBlob = new System.Net.WebClient ().DownloadString(singleUrl );
lock(singleUrl.ToString()){
this.responsesDictionary.Add(singleUrl, apiResponseBlob);
}
}