C# 委托使用与事件我的程序中有一个类,用来获取数据,有一个委托事件声明:
//显示数据 DataBase类
        public delegate void ShowDataHandle(int group,int index);
        public event ShowDataHandle ShowData;

在打开一个子窗体的情况下,首先会注册这个事件:

Guide.port为主窗口中声明的DataBase对象实例
//注册
Guide.port.ShowData += new DataBase.ShowDataHandle(port_ShowData);//委托执行的方法:

void port_ShowData(int g, int index)
 {
      show(g, index);
 }
delegate void WakeShow(int g, int index);
private void show(int g, int i)
{
     if (this.group == g)
     {
          if (!chart0.InvokeRequired)
          {
                   //数据显示
          }
          else
          {
                WakeShow wakeShow = new WakeShow(show);
                Invoke(wakeShow, g, i);
          }
      }
}然后每次获取到数据之后,会根据收到的数据组号来判断是第几组的数据,然后激活响应的委托,如下:
if (ShowData != null)
 {
      ShowData(group, index);
 }

以上代码代表了我程序中的主要过程,现在的问题是,在主窗口上有多个按钮,没个按钮代表不同的组,每次单击就会传入到子窗口不同的参数,运行的时候发现,当我打开第一个子窗口时,显示正常的,当我继续打开第二个窗口时(实例话第二对象),原先哪个窗口中就不显示数据了,让是跑到第二个窗口中去了。依次,我打开第三个窗口,那么前两个窗口中的数据也不显示了,都显示到最后一次打开的窗口中去了,而且还有一个很严重的问题,当我关闭这些子窗口时,每次关闭到最后一个子窗口时,就会报一个异常“说访问以经释放的资源”错误,停留在
                WakeShow wakeShow = new WakeShow(show);
                Invoke(wakeShow, g, i);
这个地方。关闭窗口的时候我做了删除事件委托的操作
private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    // 在FormClosing里还没执行完,Dispose不掉的.不用Dispose就可以了,gc帮你回收掉
     if (status == 1) 
     {
          Guide.port.ShowData -= port_ShowData;
     }
}
自动生成的销毁方法我也没去改动
        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }发生这种情况。我非常不解,照理说,我在关闭窗口的时候已经把委托给删掉了,这样就不会触发show这个方法了,但是调试的时候发现,我点右上角的关闭,首先会执行到FormClosing,然后再执行到Dispose,当执行到 base.Dispose(disposing);这句的时候,又跳到show里面去了,然后再 Invoke(wakeShow, g, i);这个地方报错,非常苦恼啊,很长时间没解决,还有一个情况,当我在任务栏里面右键点关闭这个窗口时,能正常关闭,在子窗口菜单中“退出”
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
     this.Close();
}这样关闭也没问题
,哎,求各位的帮忙啦,真的不知道从哪里开始去解决。
写了这么多,不知道你看懂没有?