我有一些負責執行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的代碼中有什麼?
你能解釋內部和外部while循環背後的原因嗎?特別是外邊的(真)。我認爲你的多線程已經結束 - 你提供的代碼示例是什麼?我沒有看到任何關於您發佈的代碼的多線程。 – BMac 2015-03-13 13:31:02
您好,我在另一個執行此代碼的方法中產生了數百個線程。 while循環的推理是我每隔幾秒執行一次對特定URL的請求。您看到的其他while循環可確保我擁有完成請求所需的全部數據。 – user3767692 2015-03-13 13:40:58
不知道爲什麼它會以所有的thread.sleeps運行在100%,但while(true)可能是原因。如果某些情況發生在包含單詞'timed'的異常被拋出時,您可能無限循環而無法睡眠 – Ewan 2015-03-13 13:49:04