日期:2014-05-18  浏览次数:21540 次

winform 内存优化!关闭窗口时,资源释放的问题,孤独的希望大家指导

  C# winform程序,之前也来问过问题,因为,winform直接从文本文件读数据,然后放在了内存中,因为有很多个窗口,没打开一个窗口时,可能就涉及到一些数组(我的数据源)的赋值,文本数据有200MB+,全部读到内存中去之后(已经是按照分组来读数据了) 发现此时程序占用了700MB+的内存,之后,在窗口上打开衍生出来的子窗体,占用内存进一步加大,随着打开越来越多的窗口,程序越来越慢,电脑越来越卡。

  不知道如何做优化。
  于是我想到一些方面,试了之后没效果,希望大家指导,我的基础很差;

1.是不是 我用局部变量来临时存储一些数据,方法结束之后,就应该会自动释放掉了?

2.关闭窗口时,我在formclosing里面删掉了该窗体产生的线程,还有把设计器中的Dispose放到了窗口类中,并且在 protected override void Dispose(bool disposing)中加了GC.Collect();,我想这样做,或者不用这样做,在关闭这个窗口的之后,系统是不是应该会释放它所占用的资源,可是观察了一下 任务管理器,冒失内存使用量一点就下降了3MB左右。难道我这样想是错的。
先就以上这些问题,欢迎大家给我讲解一下,谢谢啦!没分了,大家见谅

PS:我没使用数据库,我的数据源就是文本文件

------解决方案--------------------
C# code

#region 清空内存
        [DllImport("kernel32.dll")]
        public static extern bool SetProcessWorkingSetSize(IntPtr process,
            int minSize,
            int maxSize
            );
        /// <summary>
        /// 在占用大量内存的窗体关闭时执行,释放内存
        /// </summary>
        public static void FlushMemory()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
            {
                FormFunction.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
            }
        }
        #endregion

------解决方案--------------------
既然你的数据已经读到内存中了,只是在开启子窗口时内存加大
应该是你也使用了同样的数据,并且是你主窗体中数据的副本
你可以用静态变量存放你的数据,它在内存中是只有一份的,这样在你开启子窗体时内存就不会涨的那么多
------解决方案--------------------
.net的垃圾回收机制不是手动能控制的,你尝试下在子窗体里写个析构函数用来释放所声明的数组。