AddHandler / RemoveHandler处理不正确

时间:2020-03-06 14:54:10  来源:igfitidea点击:

如果我从不使用RemoveHandler,那么使用AddHandler方法是否会在某些情况下导致内存泄漏?我不太确定这个事实。

而且还有其他导致内存泄漏的原因吗(与C#相反,VB独有)?

解决方案

如果将对象a约束到对象b事件,则只有收集到对象a才会收集对象b。

事件订阅被视为对发布者对象的引用。

是的,这发生在Ctoo上,我与该语言无关。

好吧,通常它不是..但是可能性存在。
订阅事件时,基本上是将方法的委托(如果有的话,是一个函数指针)提供给事件发布者,只要我们不取消订阅-=运算符,事件发布者就会保留该事件。

因此,例如,生成一个子窗体,并且该窗体订阅了窗体上的Click按钮事件的情况。

button1.Click += new EventHandler(Form_Click_Handler);

现在,按钮对象将保留在窗体引用上。当窗体关闭/放置/设置为null时,不再需要窗体和按钮;因此,不再需要窗体和按钮。内存被回收。

当我们拥有寿命更长的全局结构或者对象时,就会发生麻烦。可以说Application对象维护着一个打开的子窗口的列表。因此,无论何时创建子表单,应用程序对象都会订阅Form事件,以便可以在其上保留选项卡。在这种情况下,即使关闭/放置了表单,应用程序对象也会使它保持活动状态(非垃圾对象持有对表单的引用),并且不允许回收其内存。当我们继续创建和关闭窗口时,应用会占用越来越多的内存,从而导致泄漏。因此,我们需要明确地取消订阅以从应用程序中删除表单引用。

childForm.Event -= new EventHandler(Form_Handler)

因此,建议我们使用一个取消订阅块(-=)来补充订阅例程(+ =)...但是,如果没有这种情况,我们可以进行管理。