长话短说,我继承了一个相当复杂的应用程序,并且试图追踪涉及表单的内存泄漏。现在,每次关闭表单并调出新表单时,旧表单都会保留在内存中。我跟踪了一个由程序内的控件拥有和设置的静态事件的问题(显然,只要设置了静态事件,就不会将该控件的实例视为超出范围,即使没有其他人引用该控件, )。现在,我正在尝试查找剩余的问题。
通过使用MemProfiler和ANTS内存配置文件,我了解到根执行路径如下所示:
FormOpenWatch <-- The item which remains active
System.EventHandler -- (this as Delegate)._target
System.Object[]
System.EventHandler -- (this as MultiCastDelegate)._invocationList
System.ComponentModel.EventHandlerList+ListEntry -- handler
System.ComponentModel.EventHandlerList+ListEntry -- next
System.ComponentModel.EventHandlerList+ListEntry -- next
System.ComponentModel.EventHandlerList+ListEntry -- next
System.ComponentModel.EventHandlerList+ListEntry -- next
System.ComponentModel.EventHandlerList -- head
PTU.MdiPTU -- (this as Component).events <-- The base application
任何人对我可能正在寻找的东西都有见识?我发现基本应用程序中添加了Shown事件,并确保在处理表单时将其删除,但这似乎并未解决问题。
非常感谢您可以提供的任何帮助。
后来的编辑:我以为我已经成功解决了好几次了,但仍然有问题。问题似乎出在我的Plotter类(以及各种派生类)上,该类具有“公共静态事件MouseEventHandler MultiCursorMouseMove;”。事件。我们有一个“光标”,它在鼠标的位置显示图形的值和时间。最初,这一次只能处理一个图形,但是提出了一个请求,允许用户切换一种模式,在该模式下,移动鼠标可以在所有显示的图形上移动图形。我编写了一个初始处理方法,以在实例化项目时将EventHandlers挂在钩子上,我整个池塘的伙伴重写了它以使用静态事件,该事件被分配给构造中的每个项目。他的方式优雅得多,工作也更好。除了导致内存泄漏以外,所有其他信息。使用内存配置文件软件已显示,每次我尝试摆脱保存图表的形式时,都会遇到许多“具有直接EventHandler根的Disposed实例”的情况。在每种情况下,它都表明该对象是绘图仪,或是该绘图仪指向的对象。并且,在每一个中,基本链接是MultiCursorMouseMove EventList指向这些对象。我认为正在发生的情况是绘图仪保持活动状态,因为它具有此静态事件,而该静态事件又与绘图仪链接。通过我的Dispose代码删除了每个绘图仪的事件,我已经设法通过调试器在给定的点上验证MultiCursorMouseMove为空,但是在同一点运行事件探查器仍然显示从MultiCursorMouseMove到这些类的链。
我目前没有解决方法的想法。任何人?
最佳答案
如果MdiPTU是您的应用程序的MDI父窗体,则听起来FormOpenWatch可能已预订了其事件之一。如果尚未直接执行订阅,则可能会在FormOpenWatch超类中找到该订阅,甚至可能在其他代码中也可以从MdiPTU事件中执行FormOpenWatch方法。