当前位置:  开发笔记 > 编程语言 > 正文

AddHandler/RemoveHandler未正确处置

如何解决《AddHandler/RemoveHandler未正确处置》经验,为你挑选了1个好方法。

使用该AddHandler方法,如果我从不使用RemoveHandler,是否会在某些情况和情况下导致内存泄漏?我不太确定这个的真相.

是否存在其他原因导致内存泄漏仅在VB中可用而不是C#?



1> Gishu..:

通常它不会......但存在可能性.
当您订阅某个事件时,您基本上会向您的方法提供一个委托(func指针,如果您愿意)到事件发布者,只要您不使用 - =运算符取消订阅,该事件发布者就会保留该事件.

例如,在您生成子表单并且表单订阅表单上的Click按钮事件的情况下.

button1.Click += new EventHandler(Form_Click_Handler);

现在按钮对象将保持表单引用.当窗体关闭/处置/设置为null时,不再需要表单和按钮; 记忆被回收了.

当您拥有一个具有更长生命周期的全局结构或对象时,就会发生这种麻烦.让我们说Application对象维护一个打开的子窗口列表.因此,每当创建子表单时,应用程序对象都会订阅Form事件,以便它可以对其进行标记.在这种情况下,即使表单被关闭/处理,应用程序对象也保持活动状态(非垃圾对象保持对表单的引用)并且不允许回收它的存储器.当你不断创建和关闭窗口时,你的应用程序会泄漏越来越多的内存.因此,您需要明确取消订阅以从应用程序中删除表单引用.

childForm.Event -= new EventHandler(Form_Handler)

所以它建议您有一个取消订阅块( - =)补充您的订阅例程(+ =)...但是你可以在没有它的情况下管理库存场景.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有