首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

while循环消耗内存的有关问题

2013-01-20 
while循环消耗内存的问题本帖最后由 viki117 于 2012-03-08 16:21:19 编辑while (ThreadStatus.thread_run

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 }

会不会是,这个地方 编译时的匿名函数结构 占用了内存??!!!

————————————————————————————————————————
而楼主  修改后,因为  实名函数 的结构固定,编译器不会二次分析函数结构,分配内存,所以 就只吃一次内存就足够??!!

————————————————————————————————————————

等待高手,给出更具有信服力的 解释!!!



热点排行