长话短说,我继承了一个相当复杂的应用程序,我正在尝试追踪涉及表单的内存泄漏。现在,每次关闭表格并提出新表格时,旧表格都会保留在内存中。我跟踪到了程序中控件拥有和设置的静态事件的问题(显然,只要设置了静态事件,该控件的实例就不会被认为超出范围,即使没有其他人引用所述控件)。现在,我正在尝试找出剩下的问题。
使用 MemProfiler 和 ANTS Memory Profile,我了解到根执行路径是这样的:
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 类(以及各种派生类)具有“public static event MouseEventHandler MultiCursorMouseMove;”事件。我们有一个“光标”,它显示鼠标所在位置的图形值和时间。最初,这一次适用于一张图表,但要求允许用户切换一种模式,在该模式下移动鼠标可在所有显示的图表上移动绘图。我编写了一个初始处理方法,在实例化项目时将事件处理程序挂钩,而我的伙伴则将其重写为使用静态事件,该事件在构造时分配给每个项目。他的方式更加优雅,效果也更好。除了它导致内存泄漏之外。使用内存分析软件表明,每次我尝试摆脱保存绘图的表单时,我都会遇到许多“具有直接 EventHandler 根的已处置实例”的情况。在每一个中,它都表明该对象是绘图仪,或者是绘图仪指向的对象。并且,在每一个中,基本链接是 MultiCursorMouseMove EventList 指向这些对象。我认为发生的情况是绘图仪保持活动状态,因为它有这个静态事件,而该静态事件又与绘图仪链接。我已经设法通过调试器在给定点验证 MultiCursorMouseMove 为空,因为我的 Dispose 代码删除了每个绘图仪的事件,但在同一点运行探查器仍然显示从 MultiCursorMouseMove 到这些类的这条链。
我目前不知道如何解决这个问题。任何人?
如果 MdiPTU 是您的应用程序的 MDI 父窗体,听起来 FormOpenWatch 可能已订阅其事件之一。如果没有直接这样做,您可能会在 FormOpenWatch 超类中找到订阅,甚至可能在其他可以从 MdiPTU 事件连接 FormOpenWatch 方法的执行的代码中找到订阅。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)