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(); //显示子窗口
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
myChildFrm.Focus(); //子窗口获得焦点
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]这样,就能够如我们如愿般调用子窗口了。[/align]
[align=left] [/align]
[align=left] [/align]
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(); //显示子窗口
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
myChildFrm.Focus(); //子窗口获得焦点
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]这样,就能够如我们如愿般调用子窗口了。[/align]
[align=left] [/align]
[align=left] [/align]
相关文章推荐
- C# 垃圾回收的基础
- c#中多线程访问winform控件的若干问题
- JVM调优总结(四)---垃圾回收面临的问题
- 在C#中使用SerialPort类实现串口通信 遇到多线程问题
- servlet 多线程安全性问题分析
- PHP的内存泄露问题与垃圾回收
- c# -- 对象销毁和垃圾回收
- C#垃圾回收和资源管理
- 单例模式讨论篇:单例模式与垃圾回收
- C#垃圾回收Finalize 和Dispose,Close的理解
- C#学习笔记12-GC的工作原理基础和垃圾回收机制
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
- 从C#垃圾回收(GC)机制中挖掘性能优化方案
- C#技术漫谈之垃圾回收机制(GC)
- 并发危险:解决多线程代码中的 11 个常见的问题(C#示例) from MSDN
- Java JVM:垃圾回收问题
- JVM调优总结(3):垃圾回收面临的问题
- JAVA文件读写输入输出流关闭问题、JAVA垃圾回收
- 单例模式的多线程极端问题
- C#中使用多线程访问Winform中控件的若干问题