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

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);
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: