C# 事件销毁问题,设备开发,控件开发,委托管理

zhq_442577358 2010-08-25 04:27:05
我是做设备开发的,现在做了个USB设备,设备作好后,使用c#来开发程序,在程序中 有个设备设别功能,当USB设备拔出时,winform窗体中的某些控件不可以用,插入时才可用。

由于设备是唯一的,现在将设备用C#代码进行了封装成一个类(这个类只能是单列模式的,还有其他用途),现在给设备注册了移除,插入事件。

问题是,当winform多个窗体都注册了插入和移除事件,那么在设备类里的委托中就有多个窗体的事件,当窗体关闭时,设备类里的委托中的事件并没移除,那么当设备移除或插入时就会执行这些事件,

请问如何在委托中的事件执行时检查窗体是否已关闭,关闭了就移除这个事件?

部分代码如下:

frmUpdateUK 窗体代码
public frmUpdateUK()
{
MsgForm mf = MsgForm.Instance;
//mf.AddUKInsertHandler(new MsgForm.UKInsertHandler(this.On_UKInsert));
mf.OnUKInsert += new MsgForm.UKInsertHandler(this.On_UKInsert);
mf.OnUKRemove += new MsgForm.UKRemoveHandler(this.On_UKRemove);

InitializeComponent();
}
private void On_UKInsert()
{
gbMain.Enabled = true;
}
private void On_UKRemove()
{
gbMain.Enabled = false;
}

设备类代码(静态类)

public delegate void UKInsertHandler
();
public delegate void UKRemoveHandler
();
public event UKInsertHandler OnUKInsert = null;
public event UKRemoveHandler OnUKRemove = null;


...全文
371 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhq_442577358 2010-08-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wuyazhe 的回复:]

你简直一锅浆糊。
事件调用的时候加try,catch,发现注册事件的对象释放或不存在了,则注销事件。不继续解释了。
[/Quote]
你试过嘛,内存没回收,所有的事件都执行了,
兔子-顾问 2010-08-25
  • 打赏
  • 举报
回复
你简直一锅浆糊。
事件调用的时候加try,catch,发现注册事件的对象释放或不存在了,则注销事件。不继续解释了。
zhq_442577358 2010-08-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wuyazhe 的回复:]

C# code
if (OnUKInsert != null)//OnUKInsert是设备插入事件
{
List<UKInsertHandler> errorList = new List<UKInsertHandler>();
//安全的调用事件
foreach (UKInsertHandler dlt in OnUKInsert.GetInvocationList……
[/Quote]
这个好像不行哦,winform窗体关闭了,事件还是可以用的,这个问题只有用反射哦
兔子-顾问 2010-08-25
  • 打赏
  • 举报
回复
if (OnUKInsert != null)//OnUKInsert是设备插入事件
{
List<UKInsertHandler> errorList = new List<UKInsertHandler>();
//安全的调用事件
foreach (UKInsertHandler dlt in OnUKInsert.GetInvocationList())
{
try
{
dlg.Invoke();
}
catch
{
errorList.Add(dlt);
}
}
//移除已经无效的事件
foreach(UKInsertHandler del in errorList)
{
OnUKInsert -= del;
}
OnUKInsert();
}
zhq_442577358 2010-08-25
  • 打赏
  • 举报
回复

if (OnUKInsert != null)//OnUKInsert是设备插入事件
{
//object ojb1 = OnUKInsert.Target;
foreach (Delegate dlt in OnUKInsert.GetInvocationList())
{
object obj = OnUKInsert.Target;
//下面两步如何做到?
if(关闭)
OnUKInsert -= new UKInsertHandler(对象的方法);
}
OnUKInsert();
}
dancingbit 2010-08-25
  • 打赏
  • 举报
回复
个人观点:没必要执着于检查窗体的状态,在FormClosing事件或FormClosed事件的处理方法中处理就很好。
dancingbit 2010-08-25
  • 打赏
  • 举报
回复
Form没有属性表明窗体是否已关闭。IsDisposed属性指明的是是否销毁。
zhq_442577358 2010-08-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dancingbit 的回复:]

并非不知道窗体应该是由别人设计的,但是你一样可以为它添加事件处理方法的。
按照你的要求,必然要操作别人的窗体的。
[/Quote]
对头啊,我就在我的设备类里检查引用对象啊,如果窗体关了就移除,现在就是不知道怎么检查这个窗体是否关里,
dancingbit 2010-08-25
  • 打赏
  • 举报
回复
并非不知道窗体应该是由别人设计的,但是你一样可以为它添加事件处理方法的。
按照你的要求,必然要操作别人的窗体的。
zhq_442577358 2010-08-25
  • 打赏
  • 举报
回复
没的其他办法吗,比如在调用时检查窗体是否关闭,关闭了就移除这个窗体的所有注册事件???
zhq_442577358 2010-08-25
  • 打赏
  • 举报
回复
不要在Closing事件中释放,这个时别人做的,我只负责设备这块
别人的使用就和控件的事件一样用,
兔子-顾问 2010-08-25
  • 打赏
  • 举报
回复
注册窗体的Close事件。在Close的时候释放。或是参考我以前这样的设计:
http://topic.csdn.net/u/20100825/11/db5a0da2-5f8c-4f27-ac95-1cf06691c104.html
这里11楼的回复
dancingbit 2010-08-25
  • 打赏
  • 举报
回复
窗体正在关闭时有FormClosing事件,关闭后有FormClosed事件。
可以在这些事件的处理代码中进行这种处理。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧