我分析了一个VB.NET项目,并且有一些对象(子MDI表单)被处理,但没有被GC删除.
MemoryProfiler分析发现以下内容:
"这个实例被释放并且仍然间接地由一个EventHandler生成.这通常表明EventHandler没有被正确删除,并且是内存泄漏的常见原因.下面的实例直接由EventHandler生成.调查它们以获得更多有关此问题的信息......"
现在,我试着弄清楚这应该是什么意思以及如何解决它.
我有一个MDI表格和一个子表格.GC打开/关闭后不会收集子表单,显然是因为MDIForm仍然(间接?)引用了EventHandlerList...
它可以是什么,我该如何解决它?
我尝试了在这个线程中推荐的修复,因为在MDI引用中有问题PropertyStore,现在这个被淘汰了,但是出现EventHandlerList了对子窗体的MDI 引用...
经过一些代码分析,我观察了一些
AddHandler newMenu.Click, AddressOf ClickMenu
Run Code Online (Sandbox Code Playgroud)
没有事先RemoveHandler newMenu.Click, AddressOf ClickMenu.这可能是主要原因吗?
并且,提议,是 Handles
Private Sub ClickMenu(sender as Object, e as EventArgs) Handles newMenu.Click
Run Code Online (Sandbox Code Playgroud)
更好的
RemoveHandler newMenu.Click, AddressOf ClickMenu
AddHandler newMenu.Click, AddressOf ClickMenu
Run Code Online (Sandbox Code Playgroud)
从内存分配的角度来看?
我正在追踪某些应用程序中的内存泄漏.许多表单共享相同的拼写检查器对象,因此生活在任何单独的表单中.我知道如果没有正确删除处理程序事件,这可能是内存泄漏的原因.
AddHandler和RemoveHandler对我有意义,因为很明显如果调用了AddHandler,那么应该有一个相应的RemoveHandler.但是,Handles关键字会自动为您删除处理程序吗?
Private Sub spellingContextMenu_Popup(ByVal sender As Object, ByVal e As System.EventArgs) Handles spellingContextMenu.Popup
Run Code Online (Sandbox Code Playgroud)
在上面,如果spellingContextMenu存在很长时间但表单死了,那么应该手动删除处理程序吗?
Microsoft自己的页面没有提供有关此http://msdn.microsoft.com/en-us/library/6k46st1y.aspx#feedback的指导