2015-03-13 344 views
0

我有一些负责执行http请求的代码,每个应用程序一次可以有数百个线程处于活动状态。c#HTTP请求的CPU负载很高

正常情况下能正常工作,但是,当有连接问题(至少我相信这是事实)的代码似乎使用CPU过量,高达100%。

这是有问题的代码段:

while (true) 
      { 
       try 
       { 
        while (threadNr > newViewerCount || threadNr >= (proxies.Count)) 
        { 
         Thread.Sleep(3000); 
        } 

        int sleepTimer = 4400 - (int)elapsed; 
        if (sleepTimer < 0) 
        { 

         sleepTimer = 1000; 
        } 

        Thread.Sleep(sleepTimer); 

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(rc.url); 

        request.Method = "GET"; 
        request.UserAgent = agent; 
        request.Proxy = new WebProxy(proxy); 
        request.Timeout = 5000; 

        request.CookieContainer = ck; 
        request.Headers.Add("Accept-Language", "en,en-US;q=0.7,en;q=0.3"); 
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
        request.Headers.Add("Accept-Encoding", "gzip, deflate"); 
        request.UserAgent = userAgents[3]; 

        HttpWebResponse webresponse; 
        using (webresponse = (HttpWebResponse)request.GetResponse()) 
        { 

        } 

       } 
       catch (Exception e) 
       { 
        int sl = 1500; 
        if (e.Message.Contains("timed")) 
        { 
         elapsed = 4399; 
         sl = 0; 
        } 
        Thread.Sleep(sl); 
        Console.WriteLine("Download exception:" + e.Message); 

        if (e.Message.Contains("404")) 
        { 
         Thread.Sleep(3000); 
         rc = getTokenUrl(proxy, ck); 
        } 

        if (e.Message.Contains("forbidden")) 
        { 
         rc = getTokenUrl(proxy, ck); 
         Console.WriteLine("forbidden " + e.Message); 
        } 
       } 
      } 

该应用程序正在运行全天候服务,大部分时间也没关系。但在某些时候,它只是开始使用100%的CPU。我相信这是在代理人花很长时间回应时发生的。为什么这可能是这种情况,我忽略了可能导致应用程序使用100%cpu的代码中有什么?

+0

你能解释内部和外部while循环背后的原因吗?特别是外边的(真)。我认为你的多线程已经结束 - 你提供的代码示例是什么?我没有看到任何关于您发布的代码的多线程。 – BMac 2015-03-13 13:31:02

+0

您好,我在另一个执行此代码的方法中产生了数百个线程。 while循环的推理是我每隔几秒执行一次对特定URL的请求。您看到的其他while循环可确保我拥有完成请求所需的全部数据。 – user3767692 2015-03-13 13:40:58

+0

不知道为什么它会以所有的thread.sleeps运行在100%,但while(true)可能是原因。如果某些情况发生在包含单词'timed'的异常被抛出时,您可能无限循环而无法睡眠 – Ewan 2015-03-13 13:49:04

回答

0

你有一个永久循环while (true),然后有一个包含“timed”的消息的异常,所以s1被设置为零,并且循环被恢复。经过的时间是4399,你试着睡1毫秒,实际上可能是零。所以当然它会使用所有可用的CPU功率,因为​​这些情况只会持续发生,并且没有任何地方可以睡觉。

至于有人提出,任务可能是一个更好的方式来处理这一点,这是相当不好的做法,有没有办法退出或处理所有错误情况的一个永恒的主题。

而且我不会用e.Message,以此来确定发生了什么。例如,如果代码在说法语的机器上运行,那么该怎么办?

+0

只有当它们超时时才会发生,所以这意味着线程通过定义做了5秒以上的其他操作。 – user3767692 2015-03-13 14:34:10

+0

是的,首先,在超时之后,它循环回去,再次尝试并超时,然后再次进行,无处不在。永恒的繁忙循环。 – 2015-03-13 14:35:53

+0

即使使用catch块中的thread.sleep(8000),它也会导致cpu以100%的速度运行。我完全不知道这在技术上甚至是可能的。 – user3767692 2015-03-13 18:19:21