在 WinForms 中,事件通过委托(Event)和 Visual Basic 的特殊语法结构 — AddHandler 和 RemoveHandler 实现。
AddHandler 语句。RemoveHandler,重要的是必须与所指向的处理程序完全一致。示例:
AddHandler Button1.Click, AddressOf Button1_Click Sub Button1_Click(sender As Object, e As EventArgs) MessageBox.Show("按钮被点击!") End Sub ' 用于取消订阅: RemoveHandler Button1.Click, AddressOf Button1_Click
在关闭窗口或销毁对象时,务必取消事件的订阅,以防止内存泄漏 — 垃圾回收器不会删除对象,直到委托仍然存在引用。
问:如果在销毁事件订阅对象时忘记调用 RemoveHandler,会发生什么情况?
答:如果对象订阅了另一个对象的事件并且没有被取消订阅(RemoveHandler),那么垃圾回收器将无法释放订阅者的内存,因为通过事件委托会保持强引用。这将导致内存泄漏。
历史
1. 在申请处理软件中,日志对象订阅了所有动态创建窗体的事件。在关闭窗体时未调用 RemoveHandler,导致随着应用程序的运行,内存消耗逐渐增加 — 对象在程序关闭之前一直驻留在内存中。
历史
2. 在教育项目中,忘记在重新打开子窗体时取消事件处理程序的订阅,导致每次打开事件都会触发多次(每次都会添加新的订阅者),造成了重复操作的级联和界面逻辑的混乱。
历史
3. 在工业操作面板上,检验员启动了自动测试,订阅了定时器事件的处理程序。每次测试后,对象会重新创建,但未取消订阅,导致逐渐减慢,这证明了在使用事件时 RemoveHandler 的关键重要性。