gpt4 book ai didi

.net - VB.Net Handles 关键字 - 我需要手动调用 RemoveHandler 吗?

转载 作者:行者123 更新时间:2023-12-02 04:52:28 24 4
gpt4 key购买 nike

我正在追踪某些应用程序中的内存泄漏。许多表单共享相同的 Spellchecker 对象,因此任何单独的表单都无法生存。我知道如果没有正确删除处理程序事件,这可能会导致内存泄漏。

AddHandler 和 RemoveHandler 对我来说很有意义,因为很明显如果调用了 AddHandler,那么应该有一个相应的 RemoveHandler。然而,Handles 关键字会自动为您删除处理程序吗?

Private Sub spellingContextMenu_Popup(ByVal sender As Object, ByVal e As System.EventArgs) Handles spellingContextMenu.Popup

在上面,如果 spellingContextMenu 存在很长时间但表单死亡,那么是否应该手动删除处理程序?

Microsoft 自己的页面没有提供关于此 http://msdn.microsoft.com/en-us/library/6k46st1y.aspx#feedback 的指导

最佳答案

Handles 关键字基于这样的假设:正常的事件订阅实践可以正常工作,垃圾收集器负责收集事件源、事件订阅者和委托(delegate)对象。当事件源没有超过订阅者时,它工作正常。一个很好的例子是窗体中的控件,当窗体关闭时,窗体中的所有控件也会消失。因此下一次垃圾回收会清除所有这些对象,包括 Handles 创建的任何委托(delegate)对象。无需明确取消订阅。

如果您的 ContextMenu 比使用它的表单生命周期更长,这听起来不像您的情况。而且您确实遇到了 GC 问题,您的 ContextMenu 通过其事件处理程序在表单上保留了一个引用,因此在收集菜单之前不会收集它。所以使用 Handles 不是正确的解决方案,您确实需要显式调用 AddHandler 和 RemoveHandler。

请注意重点,不只是为每个表单创建一个新的 ContextMenu 真的有什么意义吗?这平凡地解决了你的问题。另一种方法是不使用事件,而是让表单实现一个接口(interface)。您向拼写检查器类注册表单对象,它可以监听 Disposed 事件以知道它应该删除引用并停止通过接口(interface)进行回调。

请注意 VB.NET 中的一个错误,如果您构建程序集的调试版本,那么如果您在没有附加调试器的情况下运行它,它将为声明为 WithEvents 的每个事件泄漏一个 WeakReference。它是为实现编辑 + 继续支持而创建的,您必须部署程序集的发布版本以避免此泄漏。

关于.net - VB.Net Handles 关键字 - 我需要手动调用 RemoveHandler 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18590769/

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