/// <summary> 
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            if (disposing)
            {
                //手动释放图像资源
                foreach (System.Windows.Forms.Control ctl in this.m_ControlCollection.Values)
                {
                    ctl.Dispose();
                }
                this.m_ControlCollection.Clear();
                //手动释放产品描述控件资源
                //if (null != this.descBrowser)
                //{
                //    this.descBrowser.Dispose();
                //    this.descBrowser = null;
                //}
            }
           
            base.Dispose(disposing);
        }上面的方法不起任何作用,内存不释放,怎么回事?附图 :类图

解决方案 »

  1.   

    .Dispose只是通知垃圾回收器可以释放资源,至于释不释放由垃圾回收自己决定。
      

  2.   

    我用system.gc.collect()也没用
      

  3.   

    你在上述方法里设置断点,然后Debug下,看看程序什么时候会进入执行,或者根本没有进入执行也说不定啊。
      

  4.   

    gc只是通知垃圾回收,至于什么时候回收是微软处理的,而不是写一个GC,微软马上给你处理。需要时间的。
      

  5.   

    调用Dispose只是告诉标识这些资源可以被回收,如果内存都用,是不会马上回收的。
      

  6.   

    Dispose是用来释放非托管资源的,而不是内存;比如.NET窗体也是需要句柄的(Handle),这是非托管资源。当调用Dispose()方法后,这个窗体的Text、Name、Visable等属性仍然可以访问,因为Dispose并没有释放该窗体的内存。
      

  7.   

    其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。 
    而非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源等等这些资源一般情况下不存在于Heap(内存中用于存储对象实例的地方)中。 
    CLR的GC功能也只能释放托管资源 ,非托管资源要自己释放
      

  8.   

    其实不是执行了内存就会释放,而是告诉CLR这个资源可以释放了,而具体什么时候释放,
    还是由CLR来决定,它也主要是根据内存的使用压力来决定的~
      

  9.   

    首先,我不知道什么非托管资源的概念。好像你的m_ControlCollection中记录了所有用到的Control吧,除了那个以外,你再想想是否还有别的变量或者对象用到了Control,Dispose()方法调用之后,必须紧跟着将所有指向它的引用全部释放,否则内存将无法回收,比如某个panel内部add了一个control,那么要释放Control的引用得先将那个control从panel中移除,最后需要将指向那个control的变量释放,比如m_ControlCollection = null;
      

  10.   

    GC有时不是立马发挥作用的,可以的话用(对性能有影响,慎用)            
    //Force garbage collection.
     GC.Collect();
     //Wait for all finalizers to complete
    GC.WaitForPendingFinalizers();
      

  11.   


    ls的兄弟已经解释的很清楚了
    请参考http://www.cnblogs.com/sutengcn/archive/2008/06/22/1227539.html
      

  12.   

    据我所知,加了destructor只会让回收更慢一个“节拍”
      

  13.   


    .....gc.collect()回收的是CLR托管资源。
    Dispose()释放的是非托管资源,例如一个窗口的Form.close()方法,其实是调用了Dispose(),释放的是例如显示设备资源之类的非托管资源。你可以自己试一试。
    Form a = new Form();
    a.Dispose();
    GC.collect();
    If(a == null) Console.WriteLine("a is null!")
    else Console.WriteLine("a is not null!");
    If(a.Isdispoesd) Console.WriteLine("a is disposed!")
      

  14.   


    //设置主窗体
    private void SetControl(ItemKit.UICommon.BaseControl.CUserControlBase ctl)
            {
                if (null != ctl)
                {
                    if (this.pnlMain.Controls.Count > 0)
                    {
                        //移除中文产品描述编辑器,获取产品表述信息
                        if (this.m_ControlCollection.ContainsKey(KeyProductCNDesc)
                            && this.pnlMain.Contains(this.ctlProductCNDesc))
                        {
                            this.ctlProductCNDesc.SetDescriptionToDataModel();
                        }                    //移除英文产品描述编辑器,获取产品表述信息
                        if (this.m_ControlCollection.ContainsKey(KeyProductENDesc)
                            && this.pnlMain.Contains(this.ctlProductENDesc))
                        {
                            this.ctlProductCNDesc.SetDescriptionToDataModel();
                        }                    ((ProductBase)this.pnlMain.Controls[0]).EndEdit();
                        this.pnlMain.Controls.Clear();
                        this.pnlMain.Controls.Add(ctl);
                        ////第二次加载刷新控件
                        ctl.RefreshControlData();
                    }
                    else
                    {
                        this.pnlMain.Controls.Add(ctl);
                    }                if (ctl.Dock != DockStyle.Fill)
                    {
                        ctl.Dock = DockStyle.Fill;
                    }
                }
            }
    //点击label事件
            private void lblProductCNDescription_Click(object sender, EventArgs e)
            {
                if (this.m_CurrentLeftMenuLabel != this.lblProductCNDescription)
                {
                    this.SetCurrentLabel(this.lblProductCNDescription);                this.SetControl(this.ctlProductCNDesc);
                }
            }//私有属性
    private ProductCNDesc ctlProductCNDesc
            {
                get
                {
                    ProductCNDesc ctlBase = null;
                    if (!this.m_ControlCollection.ContainsKey(KeyProductCNDesc))
                    {
                        ctlBase = new ProductCNDesc(new Uri(DescUrl), cnDesc);
                        ctlBase.BackColor = System.Drawing.SystemColors.Control;
                        ctlBase.IBusiness = base.IBusiness;
                        ctlBase.Security = base.Security;
                        ctlBase.pageParams = base.pageParams;                    this.m_ControlCollection[KeyProductCNDesc] = ctlBase;
                    }
                    else
                    {
                        ctlBase = (ProductCNDesc)this.m_ControlCollection[KeyProductCNDesc];
                    }                return ctlBase;
                }
            }这是m_controlcollection中一个控件的周期
      

  15.   

    你调用了this.pnlMain.Controls.Clear(); 了,那么控件应该是从pnlMain中移除了,姑且认为m_controlcollection中记录了所有被添加过的Control,那你先调用Control.Dispose()后直接将其从m_controlcollection中移除看看,毕竟m_controlcollection集合中每个元素的值都是你的Control的实际引用,不移除就不能保证所有引用都为空,当然m_controlcollection本身指向null后,所有的引用也就释放了。
    Dispose()方法应该是释放对象内部占用的资源,对象本身如果还被某处引用的话,那么它本身占用的资源是不会释放的。
    我感觉对象内部的资源类似托管资源,而对象本身可以理解为非托管资源,所以释放非托管资源需要确保任何途径都无法再次访问到它了才行。