如何使用WebClient和多个线程获取API数据?

时间:2014-12-08 12:40:14

标签: c# multithreading asynchronous parallel-processing webclient

所以我试图查询可通过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?没有这些奇怪的失败?

1 个答案:

答案 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);
}
    }