如何使用 Web 客户端和多个线程获取 API 数据
本文关键字:线程 获取 API 数据 何使用 Web 客户端 | 更新日期: 2023-09-27 18:33:36
所以我正在尝试查询可通过HTTP访问的API(无授权)。为了加快速度,我尝试使用 Parallel.ForEach 循环,但似乎运行的时间越长,弹出的错误就越多。
它无法检索越来越多的请求。我知道 API 提供商没有限制我,因为我可以在我的互联网浏览器中请求完全相同的阻止 URL。此外,这些每次都是不同的失败 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?没有这些奇怪的失败?
嗨,
您是否尝试过通过同步下载来加快代码速度,就像这个问题中一样(请参阅标记的答案):
下载字符串异步等待请求完成
您可以循环访问您的 URI,并获得每次成功下载的回调。
编辑:我看到你使用
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);
}
}