• 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);
    }
  • 相关阅读:
    迎接2019多校联合新生训练赛(2018/12/31)
    Educational Codeforces Round 57 (Rated for Div. 2) 前三个题补题
    睡学预习(4)
    睡学预习(3)
    Python学习笔记(3)动态类型
    Maya Calendar POJ
    睡学预习(2)——数列极限
    2018-2019赛季多校联合新生训练赛第八场(2018/12/22)补题题解
    蓝桥杯入门题:Hello, world!
    蓝桥杯:P1103
  • 原文地址:https://www.cnblogs.com/npucloud/p/5712127.html
Copyright © 2020-2023  润新知