我在文本文件中列出了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
答案 0 :(得分:1)
我相信你正在耗尽你的io完成端口。你需要限制你的请求。如果您需要比单个框可以处理的更高的并发性,那么将并发请求分布到更多计算机上。我建议使用TPL来管理连接。我遇到了类似的事情。此外,您绝对应该不按要求处理您的HttpClient。将该代码拉出并使用单个客户端。