2015-03-13 75 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