zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    GO make&new区别
    GO 包相关
    GO 类型断言
    栈 队列 链表
    表达式求值
    动态规划 最长子序列
    04 单例模式
    02 简单工厂模式
    java设计模式 01 开山篇
    java基础07 多线程
  • 原文地址:https://www.cnblogs.com/npucloud/p/5712127.html
Copyright © 2011-2022 走看看