none
关闭窗体释放内存 RRS feed

  • 问题

  • 我在关闭窗体释放内存代码中试过如下代码,结果都不能马上释放,请会的人教教我。

                GC.Collect();
                GC.SuppressFinalize(this);
                GC.ReRegisterForFinalize(this);
                this.Dispose();
    


    Raymond

    2012年5月17日 8:41

答案

  • dear

    不管做啥窗体都一样,不要随意的自行调用GC.Collection,你的窗体若有可能被调用,那表示关闭的次数也会多,GC.Collection被调用的次数也会多;就交由系统去决定该物件是不是真的被释放吧,不然重新实例化一个物件更是消耗资源的


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年5月18日 3:52

全部回复

  • 放到Form_Closing也不行?

    你要释放什么?

    2012年5月17日 9:02
  • 1. 先dispose 再 collect

    2. collect 也不是即时回收,回收的时机由 .Net framework 决定


    学习学习....

    2012年5月17日 9:16
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    
    namespace EnterpriseMS.ClassItem
    {
        class MemoryClearClass
        {
            [DllImport("kernel32.dll")]
            private static extern bool SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
            public void FlushMemory()
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                    SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);
            }
        }
    }
    
    这个方法可以马上释放,但我并不清楚这样对计算机内存是否有害。请帮我提提看法。谢谢!

    Raymond

    2012年5月17日 10:25
  • dear

    虽然我不知道你的需求为何?但不建议自行使用GC,因为不当使用反而会让系统变慢,除非你已经很了解你要做啥。

    你可以为类别实作标准的 IDisposable Interface,也就是解构子。

    http://www.dotblogs.com.tw/larrynung/archive/2011/03/10/21774.aspx

    只有使用非托管才需要GC,但只有在不使用的情况下GC,也要注意物件实体化是需要耗费资源的,常用的物件也不要随便释放。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年5月17日 12:07
  • 谢谢你的建议和参考网址,给我的帮助很大。

    我之所以需要这么紧急的释放资源原因在于我所做的窗体是Mdi子窗体,当关闭子窗体时

    资源不想被长时间占有,所以需要一个即时释放的代码支持。

    通常只在关闭窗体时执行释放程序代码段,其他时候不执行。

    你的实例我Copy了,今天就测试看看,有问题的话还请不吝赐教。


    Raymond

    2012年5月18日 1:51
  • dear

    不管做啥窗体都一样,不要随意的自行调用GC.Collection,你的窗体若有可能被调用,那表示关闭的次数也会多,GC.Collection被调用的次数也会多;就交由系统去决定该物件是不是真的被释放吧,不然重新实例化一个物件更是消耗资源的


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2012年5月18日 3:52
  • 会影像到系统的性能稳定性!他只是把一些数据从物理内存转移到了虚拟内存中去了!并未真正意义上的释放!当您再次调用是它又会从重新调入物理内存!而频繁的使用该函数会导致硬盘页面和内存的不断的交换 ,会影响到硬盘损耗硬盘的!而且CPU的使用率也会上涨!

    2012年7月3日 2:48