gpt4 book ai didi

c# - Form_Closed 是删除事件处理程序的正确位置吗?

转载 作者:太空宇宙 更新时间:2023-11-03 20:20:33 24 4
gpt4 key购买 nike

我有一个程序集,其中拖放了一个 COM Interop VB 6.0 文本编辑器,并将其用作 .NET 包装控件...然后在一个新的 Windows 窗体程序集中,我将程序集拖放到上面并开始使用它,声明它的一个变量并为其分配事件处理程序,例如,如果 Assmbley abvoe 被命名为 MyTextControl 然后在这个 Windows 窗体我有一个变量 mytxtcntrl 和一些事件处理程序,比如

mytxtcntrl.TextEditor.ObjectDblClicked += new AxTextEditorLib._DTextEditorEvents_ObjectDblClickedEventHandler(ctlTEEditor_ObjectDblClicked);

所以现在我什至担心用“-=”删除这些事件处理程序?还是 GC 会处理它?如果我应该手动完成,那么正确的位置是什么?我将它们放在 Form_Closed 部分并运行内存分析器,它没有任何效果。

最佳答案

只有当事件源对象比事件订阅者活得更久时,才需要显式取消订阅事件。不这样做将保留对订阅对象的引用,防止它们被垃圾收集。

Winforms 经过精心设计,可以避免此类事故。您通常会在窗体或用户控件中编写事件处理程序来监听子控件触发的事件。这些子控件的生命周期与窗体的生命周期密切相关,当用户关闭窗体时,它们都会同时被处理掉。垃圾收集器不会被这个难倒,并同时收集它们。

您的 ActiveX 控件符合此模式,它将成为您窗体的子控件,因此会在窗体消失的同时消失。根本不需要显式清理。

在一些特殊情况下,这不会像描述的那样工作。一个经典的方法是您自己在自己的代码中删除一个控件,但保持窗体有效。现在您应该取消订阅任何事件以允许该控件被垃圾回收。最重要的是,您还必须在控件上显式调用 Dispose() 以确保销毁它的 native 窗口。不这样做会产生甚至垃圾收集器也无法解决的永久性泄漏,控件通过其窗口句柄保持事件状态。

第二种情况是SystemEvents类。它的事件是静态的,类对象一直存在直到程序终止。如果您以可以在不终止应用程序的情况下关闭的形式使用它们,则始终必须明确取消订阅它的事件。

关于c# - Form_Closed 是删除事件处理程序的正确位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13823731/

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