从小处看C#.net垃圾回收

来源:网络整理 责任编辑:栏目编辑 发表时间:2013-07-01 08:38 点击:

如果不用MDI来实现一个主窗体打开多个子窗体时,

从一个窗体(主窗体)打开一个(only one) 另外一个的窗体(子窗体)的实现

父窗体:MainForm

public partial class MainForm:Form

{

    ............

 

    private void menuItem1_Load(object sender,EventArgs e)    

     {

        ChildForm child1=ChildForm.Create();

        child1.show();

        child1.Focus();

     }

  

    //......

}

 

子窗体:ChildForm

 

public partial class ChildForm:Form

{

     .....

 

     static ChildForm child;

    

     Public static ChildForm Create()

      {

         if(child==null)

            child=new ChildForm();

          return Child;

      }

     ......

}

 

F5运行后,的确实现了上面提到的功能。然而,把子窗体关闭后,想再次打开该子窗体时,单击菜单项,会出现异常:ObjectDisposedException was unhandled.

 

    这是为什么呢??

 

这里涉及到C#垃圾回收的问题:

 

垃圾回收是.NET运行库的一部分。垃圾回收器管理所有的托管对象,所有需要托管数据的.NET语言(包括 C#)都受运行库的垃圾回收器的制约。垃圾回收器可以确定运行垃圾回收的最佳时间,自动进行垃圾回收。然而垃圾回收的一个产物是:C# 对象没有确定性毁坏。所以会出现对象child已被销毁,但又不为null,访问时产生ObjectDisposedException异常。

 

   怎么办??

 

   方法:应该彻底回收Child所占的资源。

  途径有二:

方法一:

修改子窗体的构造函数

public ChildForm()

{

      //.........

      this.Disposed+=new System.EventHandler(Form_Disposed)

}

然后事件Form_Disposed的处理函数

private void Form_Disposed(object sender,EventArgs e)

{

      Child=null;

}

方法二:

重写ChildForm的OnClosed方法

Protected void OnClosed(EventArgs e)

{


      base.OnClosed(e); 
      child=null;

}

当然可能有其他的方法,各位看客有兴趣的话补充一下。另外有叙述不当的地方,请多多指教,在下感激不尽。

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 浅析.NET下XML数据访问新机制
    • asp.net 面试+笔试题目第1/2页
    • C# 邮件地址是否合法的验证
    • asp.net 设置GridView的选中行的实现代码
    • C#高级编程:数据库连接[1]
    • 经典C++程序1
    • IIS 自动回收导致后台定时器失效的问题解决
    • ASP.NET GridView列表代码示例
    • Asp.net MVC源码分析--Action Filter的链式调用
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1