繁体   English   中英

如何在C#中取消挂钩事件处理程序

[英]How to unhook eventhandlers in C#

我正在研究具有多种形式的C#应用​​程序。
当我打开其中一个表单时,我添加了一个这样的事件监听器: SomeClass.MotionCompleted += new EventHandler(HandlerMethod); MotionCompleted事件是一个静态事件

我注意到,在关闭此表单后,HandlerMethod仍会在事件发生时被调用,然后导致异常,因为它试图更新表单上不再存在的内容。

eventlistener如何存在并响应事件,即使表单不再存在? 一旦调用了form.Close()或this.Close(),就不应该自动取消挂钩事件列表器,以便它们不再被调用?

这是静态事件的邪恶! :)你有一个托管泄漏

覆盖表单的OnClosing并取消注册处理程序:

protected override void OnClosing(CancelEventArgs e) {
    SomeClass.MotionCompleted -= new EventHandler(HandlerMethod);
}
Someclass.MotionCompleted -= new EventHandler(HandlerMethod);

本文展示了很多有关C#事件的提示: http//www.yoda.arachsys.com/csharp/events.html

要添加到所有重复的答案,您也可以取消这种方式:

SomeClass.MotionCompleted -= HandlerMethod;

无论使用-= HandlerMethod还是-= new EventHandler(HandlerMethod) ,输出汇编代码都是相同的。

SomeClass.MotionCompleted -= new EventHandler(HandlerMethod);

只需将“+”更改为“ - ”

你必须手动取消挂钩:

SomeClass.MotionCompleted -= HandlerMethod;

您可以使用以下代码示例:

SomeClass.MotionCompleted -= new EventHandler(HandlerMethod);

但是,您必须小心从包含HandlerMethod的对象的同一实例中取消挂起您的事件。

您需要手动取消挂起事件,如下所示: SomeClass.MotionCompleted -= new EventHandler(HandlerMethod);

不完全是。 垃圾收集器不收集表单,因为事件处理程序仍然存在。 静态事件处理程序不会被自己解开。 您可以在onClosing方法中取消挂起任何已分配的事件,例如:

SomeClass.MotionCompleted -= new EventHandler(HandlerMethod);

之后一切都应该有效。

事件是强有力的参考:它们不能被垃圾收集,除非你明确地取消它们。

这就是为什么我建议你使用一个订阅和一个unsubscibe方法来完成他们的工作并集中这个钩子(如果你不释放它们会导致内存泄漏)

private void subscribeAll()
{
  SomeClass.MotionCompleted += new EventHandler(HandlerMethod);
  // other subscription
}

private void unSubscribeAll()
{
  SomeClass.MotionCompleted -= new EventHandler(HandlerMethod);
  // other subscription
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM