最近做一个抓取新浪微博数据的程序
开了两条线程,每条线程中是一个死循环来取数据,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为何会越来越高呢?
开了两条线程,每条线程中是一个死循环来取数据,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为何会越来越高呢?
{
Thread.Sleep(200);
}
不是这里的问题
Thread.Sleep(200);这里的问题
看看其他的地方是否需要优化。
最开始就用的Timer,不理想所以改成死循环,他俩差不多啊,CPU都高kingdom_0(冰蓝水蜜桃),导致CPU高的原因可能是什么呢?一直不知道什么导致的,对象创建多了不是点更多内存吗?
{
Thread.Sleep(200);
}
这个也高。不知道怎么解释。???
请看代码 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();
}
}
{
Thread t = new Thread(new ThreadStart(Test));
t.Name = "线程"+i.ToString();
t.IsBackground = true;
t.Start();
}
你在死命的创建线程。
MSDN写了 创建和销毁线程是很昂贵地还是用线程池吧。不会频繁的创建和销毁线程
是这样的,只有在最开始的时侯创建了两条线程 /// <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();
}
}
试试看,cpu还高吗?
{
Thread t = new Thread(new ThreadStart(Test));
t.Name = "线程"+i.ToString();
t.IsBackground = true;
t.Start();
}这里直接实例化吧,不要用for建立线程,这样容易调试,另外一个办法是线程池。试一下还有问题的话,是米可能D
{
if(!isRun)
break;
curCount++;
WriteLine("【" + Thread.CurrentThread.Name + "】" + "已取" + curCount + "次!");//问题可能出现在这里
Thread.Sleep(200);
}
配置(CPU:AMD 四核8216 4G内存) CPU占到25%左右,内存在15M左右
配置(CPU:Intel 双核5130 4G内存) CPU占到50%左右,内存在20M左右看来是和配置有一些关系,马上查代码
{
curCount = 0;
rtxtShow.Clear();
}加以上代码就没问题了。我已经连续回了3个,所以不能在你的帖子上回了。
mRichTextBox.SelectionStart = mRichTextBox.Text.Length;
mRichTextBox.ScrollToCaret();
难道加了那么多文本,你没有处理一下么?比如只显示100行,你开个几天,可能几十万行了。执行ScrollToCaret就会非常非常卡。