C# “试图访问已释放的资源”
2016-07-27 18:06
260 查看
WinCE项目 VS2008
项目现有一个公共静态类PublicItems,一个窗体模板FormModel,三个继承自模板的子窗体。
现在想要实现在其中一个子窗体中对所有子窗体上一个Label显示进行修改。
实现方法:单独写一个委托类如下,在PublicItems中将其实例化为静态类dc。
public class DelegateClass { public delegate void RunModeSwitch(string mode); public event RunModeSwitch runModeSwitch; private string runMode; /// <summary> /// 运行模式(属性) /// </summary> public string RunMode { get { return runMode; } set { if (value != runMode) { runMode = value; if (runModeSwitch != null) { runModeSwitch(value); } } } } }
当子窗体1中修改了静态实例dc的RunMode属性,就会触发runModeSwitch事件的执行,这样只要在模板窗体中注册该事件,其余子窗体就会收到刷新请求。
但是调试时发现一个问题,当我打开一个子窗体并关闭后,再回到子窗体1中修改RunMode属性时,就会出现“试图访问已释放的资源”的错误。
纠结一番后明白,因为dc是一个静态的实例,每当我新打开一个子窗体时就会注册一次事件,虽然窗体关闭,可是注册的事件并未注销;
因此在子窗体1中触发了runModeSwitch事件时,RunModeSwitch委托就会去执行所有已经注册时事件,这样,如果事件代码里涉及到窗体界面控件Label的Text的修改,就会报错。所以解决方法就是在模板窗体的关闭事件里加上对该事件的注销。
private void FormModel_Load(object sender, EventArgs e) { PublicItems.dc.runModeSwitch += new DelegateClass.RunModeSwitch(dc_runModeSwitch); }
private void FormModel_Closed(object sender, EventArgs e) { PublicItems.dc.runModeSwitch -= new DelegateClass.RunModeSwitch(dc_runModeSwitch); }
相关文章推荐
- C#访问远程主机资源的方法
- C#sql查询导出为excel文件,并最终释放excel资源。
- C# 中线程资源访问互斥锁
- C#访问远程主机资源的方法汇总和对比
- C#访问远程主机资源的方法
- C#在父窗口中调用子窗口的过程(无法访问已释放的对象)
- C#和C++的不兼容;ReadFile卡死;C#资源如何立刻释放资源
- C#资源释放及Dispose、Close和析构方法
- C#嵌入dll到资源释放的问题
- C#访问远程主机资源的方法
- C# 资源释放
- C#导出Excel后关闭进程(EXCEL.EXE)释放资源的解决方案
- 提高C#编程水平的50个要点 之十五“使用 using 和 try-finally 来处理资源的释放”
- C# .resx资源文件访问权限
- C#访问远程主机资源的方法
- C#资源释放方法实例分析
- C# Socket连接 无法访问已释放的对象
- 深刻理解C#中资源释放
- c#:使用using关键字自动释放资源未必一定就会有明显好处(转)
- C#线程无法访问已释放的对象