.net 移除基窗体上的处理程序

.net 移除基窗体上的处理程序,.net,vb.net,winforms,.net-2.0,event-handling,.net,Vb.net,Winforms,.net 2.0,Event Handling,我想知道是否可以从关闭方法中的one基窗体中删除子窗体中添加的所有事件处理程序。(VB.NET;.NET 2.0) 背景: 在一个项目中,我分析了一个内存问题。我使用内存配置文件进行了验证(请参阅),发现一些表单没有被GC收集,可能是因为EventHandler未删除引用 在项目中,所有表单都继承自BaseForm。现在,我在OnClosed方法foreach控件中搜索一种方法,以删除子窗体中的所有EventHandler 这可能吗?嗯,您可以使用反射来查找所有事件。但我认为没有办法枚举分配给事

我想知道是否可以从关闭方法中的one基窗体中删除子窗体中添加的所有事件处理程序。(VB.NET;.NET 2.0)

背景: 在一个项目中,我分析了一个内存问题。我使用内存配置文件进行了验证(请参阅),发现一些表单没有被GC收集,可能是因为EventHandler未删除引用

在项目中,所有表单都继承自BaseForm。现在,我在OnClosed方法foreach控件中搜索一种方法,以删除子窗体中的所有EventHandler


这可能吗?

嗯,您可以使用反射来查找所有事件。但我认为没有办法枚举分配给事件的处理程序。事件属性只有添加和删除访问器

嗯,你可以使用反射来查找所有事件。但我认为没有办法枚举分配给事件的处理程序。事件属性只有添加和删除访问器

不,Windows窗体使此操作非常困难。它使用事件的添加和删除访问器,将事件处理程序委托存储在列表中。从该列表中删除处理程序的唯一方法是使用RemoveHandler,提供完全相同的参数AddressOf。从技术上讲,通过反射戳列表是可能的,您需要首先找到用于识别列表中事件的秘密“cookie”。您需要使用Reflector或引用源来查找cookie的名称


查看这篇文章,了解MenuItem导致泄漏的可能原因。

否,Windows窗体使这项工作非常困难。它使用事件的添加和删除访问器,将事件处理程序委托存储在列表中。从该列表中删除处理程序的唯一方法是使用RemoveHandler,提供完全相同的参数AddressOf。从技术上讲,通过反射戳列表是可能的,您需要首先找到用于识别列表中事件的秘密“cookie”。您需要使用Reflector或引用源来查找cookie的名称

查看此内容,了解MenuItem导致泄漏的可能原因