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();
}这样关闭也没问题,哎,求各位的帮忙啦,真的不知道从哪里开始去解决。
写了这么多,不知道你看懂没有?
//显示数据 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();
}这样关闭也没问题,哎,求各位的帮忙啦,真的不知道从哪里开始去解决。
写了这么多,不知道你看懂没有?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货