while循环消耗内存的问题
本帖最后由 viki117 于 2012-03-08 16:21:19 编辑
while (ThreadStatus.thread_running == m_status)
{
mMessage msg = null;
lock (m_queueLock)
{
if (t_msgQueue_high.Count > 0)
{
msg = t_msgQueue_high[0];
t_msgQueue_high.RemoveAt(0);
}
else if (t_msgQueue_Ordinary.Count > 0)
{
msg = t_msgQueue_Ordinary[0];
t_msgQueue_Ordinary.RemoveAt(0);
}
else if (t_msgQueue_low.Count > 0)
{
msg = t_msgQueue_low[0];
t_msgQueue_low.RemoveAt(0);
}
else
{
Thread.Sleep(1);
continue;
}
}
if (msg.mMessageID != mMessageEnum.event_stopAll)
{
Thread thread = new Thread(() => HandleRequestMessage(msg)) { IsBackground = true };
lock (nowSizeLock)
{
m_nowSize++;
}
thread.Start();
}
else
{
lock (m_queueLock)
{
//结束消息,标记状态
m_status = ThreadStatus.thread_stopping;
}
}
}
上面一段while循环,注意起线程的那段,
现在是这样的情况,在实际循环中,程序在第一个continue的时候就返回了,然后没有继续下面的代码,但是内存却在不停的增长,虽然增长的速度缓慢,但内存的确在一直增加;
然后把起线程那段写成另外一个函数
private void CreateThread(mMessage msg)
{
Thread thread = new Thread(() => HandleRequestMessage(msg)) { IsBackground = true };
lock (nowSizeLock)
{
m_nowSize++;
}
thread.Start();
}
然后把代码替换成
if (msg.mMessageID != mMessageEnum.event_stopAll)
{
CreateThread(msg);
}
else
{
lock (m_queueLock)
{
//结束消息,标记状态
m_status = ThreadStatus.thread_stopping;
}
}
按上面的方式修改了代码后,内存不增长了,循环效果一样,各位如果不相信可以测试下,本人win7+vs2010,我不明白写里面和写外面居然有如此大的区别,作用域的问题~~求解~!
[解决办法]
改用单线程来实现,看看内存的变化。
[解决办法]
continue并不代表循环结束了,而是进行下一次循环然后在continue再循环,
你确定while (ThreadStatus.thread_running == m_status)在第一次continue后就结束循环了吗?
[解决办法]
虽然我想测试,但是代码不完整,不方便测试。
另外不知道你所说的是否属实,如果真是这样,要分析原因就必须查看最终产生的IL代码,看编译器最终是怎么处理的。
[解决办法]
会不会是release版本,由于编译器优化,而造成无视continue而预加载后继代码.
[解决办法]
不懂,帮顶吧,我只是感觉 while循环如果循环次数太多的话挺占CUP的,增经写过一个WHILE的死循环,CPU占用率占了八九十,内存还是没发现的
[解决办法]
楼主的问题,挺幽默的!!!
——理论上,理想主义的想法是: 一段代码都没有执行到,就不应该 吃内存的!!
会不会是 匿名函数的 重新运行编译造成的!!
毕竟:实名函数 和 匿名函数 的 最大区别,就在于,匿名函数 的实际结构是不确定的!!
而 实名函数 的实际结构是 确定的(实名函数代码确定)!
————————————————————————————————————————
比如:
public List<T> AAAA(int id)
{
List<T> list=总数据.FindAll(x=>{x.Id==id });
return list;
}
这个里面的匿名函数 x=>{x.Id==id } 是不确定的: id 是不确定的,且这个id 不是 函数参数!!
假如我是编译器,我处理时:
AAAA(3) 我就编译成 (x)=>{x.Id==3 }
AAAA(4) 我就编译成 (x)=>{x.Id==4 }
会不会是,这个地方 编译时的匿名函数结构 占用了内存??!!!
————————————————————————————————————————
而楼主 修改后,因为 实名函数 的结构固定,编译器不会二次分析函数结构,分配内存,所以 就只吃一次内存就足够??!!
————————————————————————————————————————
等待高手,给出更具有信服力的 解释!!!