我有一些负责执行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);
}
}
}
此应用程序全天候运行,大部分时间都可以。但在某些时候它只是开始使用100%的CPU。我相信当代理需要很长时间才能做出回应时会发生这种情况。为什么可能是这种情况,我忽略的代码中有什么可能导致应用程序使用100%的CPU?
答案 0 :(得分:0)
你有while (true)
的永久循环,然后有一个包含&#34; timed&#34;的消息的异常,所以s1被设置为零并且循环被恢复。经历了4399,你试着睡了1毫秒,实际上可能是零。所以当然它正在使用所有可用的CPU功率,因为这些条件一直在发生,并且在任何地方都没有睡眠。
正如所建议的那样,任务可能是处理这种情况的更好方法,并且拥有一个无法退出或处理所有错误情况的永恒线程是非常糟糕的做法。
此外,我不会使用e.Message来确定发生的事情。如果代码在讲法语的机器上运行怎么办?