我有一些负责执行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