C# “试图访问已释放的资源”

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);
}
原文地址:https://www.cnblogs.com/npucloud/p/5712127.html