最近做一个抓取新浪微博数据的程序
开了两条线程,每条线程中是一个死循环来取数据,sleep(200),发现CPU一路走高
在服务器上运行,
刚开始
CPU:0%-5%, 内存:2M-5M2个小时
CPU:10%-20%, 内存:6M-10M10个小时
CPU:50%左右, 内存:10M-15M这是一个大概的数据,就是想说明CPU随着时间越来越高,程序时间长了就慢下来了,重启一下程序就又快了。中间我做了一个测试
while(true)
{
Thread.Sleep(200);
}
发现什么都不做,CPU一样越来越高程序里该释放的资源我都关闭并释放了。CPU为何会越来越高呢?

解决方案 »

  1.   

    while(true)
    {
    Thread.Sleep(200);
    }
    不是这里的问题
      

  2.   

    不是
    Thread.Sleep(200);这里的问题
    看看其他的地方是否需要优化。
      

  3.   


    最开始就用的Timer,不理想所以改成死循环,他俩差不多啊,CPU都高kingdom_0(冰蓝水蜜桃),导致CPU高的原因可能是什么呢?一直不知道什么导致的,对象创建多了不是点更多内存吗? 
      

  4.   

    本身Http操作就占用cpu,况且你的操作还很频繁。while(true)
    {
    Thread.Sleep(200);
    }
    这个也高。不知道怎么解释。???
      

  5.   


    请看代码        private System.Windows.Forms.RichTextBox rtxtShow;
            this.rtxtShow = new System.Windows.Forms.RichTextBox();
            delegate void RtxtDelegate(string text);        /// <summary>输出</summary>
            private  void WriteLine(string text)
            {
                if (rtxtShow.InvokeRequired)
                {
                    RtxtDelegate rtxtDelegate = new RtxtDelegate(WriteLine);                this.Invoke(rtxtDelegate,new object[]{text});
                }
                else
                {
                    rtxtShow.AppendText(text + "\r\n");
                    rtxtShow.SelectionStart = rtxtShow.Text.Length;
                    rtxtShow.ScrollToCaret();
                }
            }
            int curCount = 0;
            private void Test()
            {
                while(true)
                {
                    if(!isRun)
                        break;
                    curCount++;
                    WriteLine("【" + Thread.CurrentThread.Name + "】" + "已取" + curCount + "次!");
                    Thread.Sleep(200);
                }       
            }
            private void btnStart_Click(object sender,EventArgs e)
            {
                    for (int i = 1; i <= threadCount; i++)
                    {
                        Thread t = new Thread(new ThreadStart(Test));
                        t.Name = "线程"+i.ToString();
                        t.IsBackground = true;
                        t.Start();
                    }
            }
      

  6.   

    for (int i = 1; i <= threadCount; i++)
                    {
                        Thread t = new Thread(new ThreadStart(Test));
                        t.Name = "线程"+i.ToString();
                        t.IsBackground = true;
                        t.Start();
                    }
    你在死命的创建线程。
    MSDN写了 创建和销毁线程是很昂贵地还是用线程池吧。不会频繁的创建和销毁线程
      

  7.   


    是这样的,只有在最开始的时侯创建了两条线程      /// <summary>开始</summary>
          private void btnStart_Click(object sender,EventArgs e)
            {
                    for (int i = 1; i <= 2; i++)
                    {
                        Thread t = new Thread(new ThreadStart(Test));
                        t.Name = "线程"+i.ToString();
                        t.IsBackground = true;
                        t.Start();
                    }
            }
      

  8.   

    注释此行:WriteLine("【" + Thread.CurrentThread.Name + "】" + "已取" + curCount + "次!");
    试试看,cpu还高吗?
      

  9.   

    一定是线程问题,测试代码写好点,不要有漏洞for (int i = 1; i <= 2; i++)
                    {
                        Thread t = new Thread(new ThreadStart(Test));
                        t.Name = "线程"+i.ToString();
                        t.IsBackground = true;
                        t.Start();
                    }这里直接实例化吧,不要用for建立线程,这样容易调试,另外一个办法是线程池。试一下还有问题的话,是米可能D
      

  10.   

    while 恒为true啊,这样可不行
      

  11.   

     首先循环创建新线程就占内存,然后就是While死循环里的问题了while(true)
    {
         if(!isRun)
             break;
         curCount++;
          WriteLine("【" + Thread.CurrentThread.Name + "】" + "已取" + curCount + "次!");
    //问题可能出现在这里
           Thread.Sleep(200);
    }       
      

  12.   

    用楼主的代码没有发现CPU被占用的问题。
      

  13.   

    看楼主的疑问,好像是这句Thread.Sleep(200);没有起作用。
      

  14.   

    3个小时以后CPU就20%了,改成Sleep(1)会很快出现楼主说的问题。
      

  15.   

    首先感谢LS诸位的回答,我会分别试一下各位的方法。这几天有事请假几天,用了三台服务器,都跑了五天,程序都反映不过来了(就是控件都点半天点不动,没有出现无响应的现象),还好最后都响应过来了。运行5天后的详细情况列一下:
    配置(CPU:AMD 四核8216 4G内存) CPU占到25%左右,内存在15M左右
    配置(CPU:Intel 双核5130 4G内存) CPU占到50%左右,内存在20M左右看来是和配置有一些关系,马上查代码
      

  16.   

    感谢jlbaowei ,我看到了你的私信:if  (curCount ==5000)
    {
         curCount = 0;
         rtxtShow.Clear();
    }加以上代码就没问题了。我已经连续回了3个,所以不能在你的帖子上回了。
      

  17.   

    mRichTextBox.AppendText(text + "\r\n");
    mRichTextBox.SelectionStart = mRichTextBox.Text.Length;
    mRichTextBox.ScrollToCaret();
    难道加了那么多文本,你没有处理一下么?比如只显示100行,你开个几天,可能几十万行了。执行ScrollToCaret就会非常非常卡。
      

  18.   

    我试过了,问题果然出在RichTextBox上面当rtxtShow.Clear();后,CPU立即降为00呵呵,希望引以为界
      

  19.   

    以前上司跟我说的, 哪怕是sleep(1),也会有帮助减少CPU,这是典型的”设计模式“一般他都是开20~30个线程,我也比较认同这种做法