c#

位置:IT落伍者 >> c# >> 浏览文章

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


发布日期:2024年07月20日
 
从小处看C#.net垃圾回收
如果不用MDI来实现一个主窗体打开多个子窗体时

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

父窗体MainForm

public partial class MainForm:Form

{

private void menuItem_Load(object senderEventArgs e)

{

ChildForm child=ChildFormCreate();

childshow();

childFocus();

}

//

}

子窗体ChildForm

public partial class ChildForm:Form

{

static ChildForm child;

Public static ChildForm Create()

{

if(child==null)

child=new ChildForm();

return Child;

}

}

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

这是为什么呢??

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

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

怎么办??

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

途径有二

方法一

修改子窗体的构造函数

public ChildForm()

{

//

thisDisposed+=new SystemEventHandler(Form_Disposed)

}

然后事件Form_Disposed的处理函数

private void Form_Disposed(object senderEventArgs e)

{

Child=null;

}

方法二

重写ChildForm的OnClosed方法

Protected void OnClosed(EventArgs e)

{

baseOnClosed(e);

child=null;

}

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

上一篇:VS.NETRC5无法创建Add-IN工程

下一篇:.net中利用数据工厂实现多数据库的操作