gpt4 book ai didi

vb.net - AddHandler/RemoveHandler 未正确处理

转载 作者:行者123 更新时间:2023-12-02 01:18:21 27 4
gpt4 key购买 nike

使用AddHandler方法,如果我从不使用RemoveHandler,在某些条件和情况下会导致内存泄漏吗?我不太确定这件事的真实性。

还有其他导致内存泄漏的原因吗?这些原因仅在 VB 中存在,而在 C# 中则不同?

最佳答案

通常情况下不会..但可能性是存在的。
当您订阅一个事件时,您基本上会将您的方法的委托(delegate)(如果您愿意的话,一个 func 指针)交给事件发布者,只要您不使用 -= 运算符取消订阅,事件发布者就会保留该事件。

举个例子,您生成一个子表单,并且该表单订阅了表单上的 Click 按钮事件。

button1.Click += new EventHandler(Form_Click_Handler);

现在按钮对象将保留表单引用。当表单关闭/处置/设置为 null 时,不再需要表单和按钮;内存被回收。

当您有一个具有较长生命周期的全局结构或对象时,就会出现问题。假设应用程序对象维护一个打开的子窗口列表。因此,每当创建子表单时,应用程序对象都会订阅 Form 事件,以便可以对其进行监视。在这种情况下,即使关闭/处置表单,应用程序对象也会使其保持事件状态(非垃圾对象保存对表单的引用)并且不允许回收其内存。当您不断创建和关闭窗口时,您的应用程序会占用越来越多的内存,从而导致泄漏。因此,您需要显式取消订阅以从应用程序中删除表单引用。

childForm.Event -= new EventHandler(Form_Handler)

因此,建议您使用取消订阅 block (-=) 来补充您的订阅例程 (+=)...但是,对于股票场景,您可以在没有它的情况下进行管理。

关于vb.net - AddHandler/RemoveHandler 未正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/151303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com