[英]c# high CPU load on HTTP requests
我有一些代碼負責執行http請求,每個應用程序一次可以有數百個線程處於活動狀態。
通常,這可以正常工作,但是,當出現連接問題時(至少我認為是這種情況),該代碼似乎使用了過多的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);
}
}
}
該應用程序正在全天候運行24/7,大多數時間都可以。 但是在某些時候,它只是開始使用100%cpu。 我相信當代理人花費很長時間做出回應時,就會發生這種情況。 為什么可能是這種情況,我忽略了代碼中的某些內容,可能導致應用程序使用100%cpu?
您有一個while (true)
的永久循環,然后消息包含“ timed”的異常,因此將s1設置為零,然后恢復循環。 經過的時間是4399,您嘗試睡眠1毫秒,這實際上可能是零。 因此,它當然會使用所有可能的CPU能力,因為這些情況一直在發生,而且任何地方都沒有睡眠。
如建議的那樣,任務可能是處理此問題的更好方法,並且擁有一個永生線程而無法退出或處理所有錯誤情況的方法是非常糟糕的做法。
另外,我不會使用e.Message作為確定發生了什么的方式。 例如,如果代碼在說法語的機器上運行怎么辦?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.