异步HttpClient请求减慢

时间:2014-01-23 16:54:08

标签: c# async-await

我在文本文件中列出了10 000 000个网址。现在我用我的等待/异步方法打开它们 - 在老化时速度非常好(接近10 000 url / min)但是在程序运行时它会在~10小时后降低到500 urls / min。当我重新启动程序并从请求运行时,情况是相同的 - 快速开始然后越来越慢。我正在使用Windows Server 2008 R2。在各种PC上测试了我的代码 - 一些结果。你能告诉我问题出在哪里吗?

 int finishedUrls = 0;
 IEnumerable<string> urls = File.ReadLines("urlslist.txt");
 await urls.ForEachAsync(500, async url =>
    {                        
        Uri newUri;
        if (!Uri.TryCreate(siteUrl, UriKind.Absolute, out newUri)) return false;
        _uri = newUri;
        var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(30));
        string html = "";
        using(var _httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30),MaxResponseContentBufferSize = 300000 }) {
            using(var _req = new HttpRequestMessage(HttpMethod.Get, _uri)){
                using( var _response = await _httpClient.SendAsync(_req,HttpCompletionOption.ResponseContentRead,timeout.Token).ConfigureAwait(false)) {

                        if (_response != null &&
                            (_response.StatusCode == HttpStatusCode.OK || _response.StatusCode == HttpStatusCode.NotFound))
                        {
                            using (var cancel = timeout.Token.Register(_response.Dispose))
                            {
                                var rawResponse = await _response.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
                                html = Encoding.UTF8.GetString(rawResponse);
                            }
                        }
                }
            }
        }
        Interlocked.Increment(ref finishedUrls);
    });

http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx

1 个答案:

答案 0 :(得分:1)

我相信你正在耗尽你的io完成端口。你需要限制你的请求。如果您需要比单个框可以处理的更高的并发性,那么将并发请求分布到更多计算机上。我建议使用TPL来管理连接。我遇到了类似的事情。此外,您绝对应该按要求处理您的HttpClient。将该代码拉出并使用单个客户端。