c#HTTP请求的高CPU负载

c#HTTP请求的高CPU负载,c#,multithreading,httpwebrequest,C#,Multithreading,Httpwebrequest,我有一些代码负责执行http请求,每个应用程序一次可以有数百个线程处于活动状态 正常情况下,这可以正常工作,但是,当存在连接问题时(至少我认为是这样),代码似乎使用了过多的CPU,高达100% 这是一段有问题的代码: while (true) { try { while (threadNr > newViewerCount || threadNr >= (

我有一些代码负责执行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);
                    }
                }
            }
while(true)
{
尝试
{
while(threadNr>newViewerCount | | threadNr>=(proxies.Count))
{
睡眠(3000);
}
int sleepTimer=4400-(int)已过;
如果(睡眠计时器<0)
{
睡眠计时器=1000;
}
睡眠(睡眠计时器);
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(rc.url);
request.Method=“GET”;
request.UserAgent=agent;
request.Proxy=新的WebProxy(Proxy);
请求超时=5000;
request.CookieContainer=ck;
添加(“接受语言”,“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”;
Add(“接受编码”、“gzip、deflate”);
request.UserAgent=userAgents[3];
HttpWebResponse-webresponse;
使用(webresponse=(HttpWebResponse)request.GetResponse())
{
}
}
捕获(例外e)
{
int sl=1500;
如果(例如,消息包含(“定时”))
{
时间=4399;
sl=0;
}
睡眠(sl);
Console.WriteLine(“下载异常:+e.Message”);
如果(例如,消息包含(“404”))
{
睡眠(3000);
rc=getTokenUrl(代理,ck);
}
如果(如消息包含(“禁止”))
{
rc=getTokenUrl(代理,ck);
控制台写入线(“禁止”+e.Message);
}
}
}

这个应用程序是全天候运行的,大部分时间都是正常的。但在某些时候,它只是开始使用100%的cpu。我相信当代理需要很长时间才能做出回应时,就会发生这种情况。为什么可能是这种情况,我忽略的代码中是否有什么东西会导致应用程序使用100%的cpu?

您有一个永久循环
,而(true)
,然后有一个包含“timed”的消息异常,因此s1被设置为零,循环被恢复。已用时间是4399,您尝试睡眠1毫秒,实际上可能是零。因此,当然,它正在使用所有可用的CPU电源,因为这些情况一直在发生,而且任何地方都没有睡眠

正如所建议的那样,任务可能是处理此问题的更好方法,而拥有一个无法退出或处理所有错误情况的永恒线程是非常糟糕的做法


我也不会用e.Message来判断发生了什么。例如,如果代码在讲法语的机器上运行会怎样?

您能解释一下内部和外部while循环背后的原因吗?尤其是外部的,而不是真实的。我想您的多线程已经与您提供的代码示例脱离了关系?关于你发布的代码,我没有看到任何多线程的东西。您好,我在另一个执行此代码的方法中生成了数百个线程。while循环的原因是我每隔几秒钟就执行一次对特定url的请求。您看到的另一个while循环确保我拥有完成请求所需的所有数据。不确定为什么它会在所有线程中100%运行。您有睡眠,但while(true)可能是原因。如果发生了包含单词“timed”的异常,您可以无限循环而不睡眠。我建议您重构以使用任务列表。通过某种方式,我可以精确指出导致应用程序中负载的确切原因?请记住,这个问题似乎是情境性的。它只会在有超时的情况下发生,因此这意味着线程在5秒以上的时间内执行其他操作。是的,首先,在超时之后,它会返回并重试一次,超时一次,再重试一次,其间没有任何睡眠。永久忙循环。即使catch块中有thread.sleep(8000),也会导致cpu以100%的速度运行。我完全不明白这在技术上是怎么可能的。