相关疑难解决方法(0)

事件处理程序和内存泄漏

我分析了一个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)

从内存分配的角度来看?

.net memory-leaks event-handling .net-2.0

6
推荐指数
1
解决办法
3908
查看次数

VB.Net处理关键字 - 我是否需要手动调用RemoveHandler?

我正在追踪某些应用程序中的内存泄漏.许多表单共享相同的拼写检查器对象,因此生活在任何单独的表单中.我知道如果没有正确删除处理程序事件,这可能是内存泄漏的原因.

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的指导

.net vb.net

2
推荐指数
1
解决办法
723
查看次数

标签 统计

.net ×2

.net-2.0 ×1

event-handling ×1

memory-leaks ×1

vb.net ×1