如何使用 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?没有这些奇怪的失败?

如何使用 Web 客户端和多个线程获取 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);
}
    }