首页 > 解决方案 > 使用“刻录”CPU 进行 httpwebrequest

问题描述

我想运行大约 10,000 个并发请求,使用 .net HttpWebRequest,并不是所有的请求都去同一个主机,其中一些通过代理池。

我目前正在使用线程,它可以在最多 1000 个并发时正常工作,但是我的 CPU 负载为 100%。如何解决?

public string HttpGet(string url)
{
    try {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.Timeout = 20000;
        request.CookieContainer = Cookie;
        request.AutomaticDecompression = DecompressionMethods.GZip;
        request.KeepAlive = true;
        request.Method = "GET";
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        Stream dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string tmp = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        response.Close();

        return tmp;
    } catch (Exception ex) {
        return "";
    }
}

我每次都发送请求,所以在 1 分钟内发出 1000 个请求。

标签: c#

解决方案


  1. 使用异步任务而不是线程。I/O 操作不需要线程来等待它们,但操作系统会花时间在它们之间切换。
  2. 即使请求失败,也可以使用using块而不是调用来正确处置资源。Close
  3. 不要忘记为并发请求设置正确的最大限制。
  4. catch (Exception ex)是一种反模式。

推荐阅读