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

PIC*_*ain 2 c# event-handling winforms formclosing

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

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

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

Sto*_*net 6

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

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

protected override void OnClosing(CancelEventArgs e) {
    SomeClass.MotionCompleted -= new EventHandler(HandlerMethod);
}
Run Code Online (Sandbox Code Playgroud)

  • OnFormClosing在技术上不正确,可能会被取消.使用OnFormClosed.从设计器文件中剪切和粘贴Dispose()方法更加正确.这是自动获得的. (3认同)