写代码的伟哥 2021-10-03 23:30 采纳率: 50%
浏览 526
已结题

C# HttpWebRequest 越来越慢是什么原因?

比如我有1万个不同的网址准备进行访问。在50个线程的情况下, 刚启动速度很快,运行几分钟后越来越慢,以下是代码片段。

class HttpRequest
    {
        private string url;
        private string userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36";

        private string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";

        private int timeOut = 8000;

        private bool keepAlive = false;

        public string UserAgent { get => userAgent; set => userAgent = value; }
        public string Accept { get => accept; set => accept = value; }
        public int TimeOut { get => timeOut; set => timeOut = value; }
        public bool KeepAlive { get => keepAlive; set => keepAlive = value; }
        public string Url { get => url; set => url = value; }

        public HttpResponse Get()
        {
            HttpWebRequest request = null;
            HttpWebResponse response = null;
            HttpResponse resp = new HttpResponse();

            string host = this.url.Split('/')[2];
            request = (HttpWebRequest)HttpWebRequest.Create(this.url);
            request.Method = "GET";
            request.Accept = accept;
            request.UserAgent = userAgent;
            request.Timeout = timeOut;
            request.ReadWriteTimeout = timeOut;
            request.ContinueTimeout = timeOut;
            request.AllowAutoRedirect = true;
            request.MaximumAutomaticRedirections = 3;
            request.KeepAlive = keepAlive;
            request.Proxy = null;
            request.ServicePoint.Expect100Continue = false;
            request.ServicePoint.UseNagleAlgorithm = false;
            request.ServicePoint.ConnectionLimit = 65500;
            request.AllowWriteStreamBuffering = false;
            request.Host = host;
            request.Referer = "http://" + this.url.Split('/')[2];
            request.Headers.Add("Accept-Encoding", "gzip");

            try
            {
                response = (HttpWebResponse)request.GetResponse(); //发起请求
                resp.StatusCode = response.StatusCode;
                resp.Html = GetResponseBody(response);
                return resp;
            }
            catch (Exception ex)
            {

                resp.Html = ex.Message;

                if (response != null)
                {
                    resp.StatusCode = response.StatusCode;
                    response.Close();
                }

                if (request != null)
                {
                    request.Abort();
                }

                return resp;

            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                }

                if (request != null)
                {
                    request.Abort();
                }
            }

            
        }

以下是调用代码:


//list 里面有1万个链接
            for (int i = 0; i < 50; i++)
            {
                Task.Factory.StartNew(() =>
                {
                    Random r = new Random((int)DateTime.Now.Ticks);

                    while (true)
                    {
                        string links = list[r.Next(0, list.Count - 1)];//随机取一个链接

                        HttpRequest http = new HttpRequest();
                        http.Url = links;
                        http.Get();

                        System.Threading.Thread.Sleep(1);
                    }



                }, TaskCreationOptions.LongRunning);
            }

以下是线程耗时:

img

  • 写回答

4条回答 默认 最新

  • 神仙别闹 2021-10-03 23:38
    关注

    尝试关掉代理,在配置文件中(.config)中添加配置节:

    <?xml version="1.0"?>  
    <configuration>  
      <startup>  
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>  
      </startup>  
      <system.net>  
        <defaultProxy  
            enabled="false"  
            useDefaultCredentials="false" >  
          <proxy/>  
          <bypasslist/>  
          <module/>  
        </defaultProxy>  
      </system.net>  
    </configuration>  
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月7日
  • 创建了问题 10月3日

悬赏问题

  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器