您的位置:首页 > 编程语言 > C#

C#垃圾回收问题--》多线程的不安全性--》单例模式

2018-01-26 22:50 387 查看
C#在父窗口中调用子窗口的过程:

1、 创建子窗口对象
2、 显示子窗口对象

笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm。在窗体中定义了子窗口对象,然后在菜单项点击事件中,加入了如下代码来创建和显示子窗口:

Private childFrm myChildFrm = null; //定义子窗口对象
private void OpenChildFrmToolStripMenuItem_Click(object sender, EventArgs e)
private void OpenChildFrmToolStripMenuItem_Click(object sender, EventArgs e)

[align=left] [/align]
[align=left] [/align]
[align=left]这样修改的目的是:当子窗口对象存在时,直接显示子窗口。当子窗口不存在时,创建子窗口,然后再显示。[/align]
[align=left] [/align]
[align=left]现在来检验效果:当第一次点击OpenChild菜单项时,创建子窗口并正确显示。不关闭子窗口的情况下再点击OpenChild菜单项,子窗口只显示了一个,说明按预期工作了。现在,我们关闭子窗口,再点击OpenChild菜单项,程序在运行到下面这个语句时出现“未处理ObjectDisposedException”异常。[/align]
[align=left] [/align]
[align=left]if(myChildFrm != null)[/align]
[align=left]{[/align]
[align=left] myChildFrm.Show();//显示子窗口[/align]
[align=left] [/align]
[align=left]错误信息:无法访问已释放的对象。对象名:“childFrm”。[/align]
[align=left]private void OpenChildFrmToolStripMenuItem_Click(object sender, EventArgs e)
[/align]

[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]前面这是按逻辑的方式进行思考的,显示子窗口和获得焦点两行是重复的,两个if语句也可以做一下简化。指定子窗口和父窗口的父子关系。最后的结果是这样:[/align]
[align=left] [/align]

private void OpenChildFrmToolStripMenuItem_Click(object sender, EventArgs e)

myChildFrm.Show(); //显示子窗口


myChildFrm.Focus(); //子窗口获得焦点


}

[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]这样,就能够如我们如愿般调用子窗口了。[/align]
[align=left] [/align]
[align=left] [/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: