如何完全删除静态事件的所有项目
本文关键字:项目 事件 何完全 删除 静态 | 更新日期: 2023-09-27 18:15:04
我有一个类Plotter
,它有一个静态事件(对于那些想知道我如何拥有静态事件的人来说,声明为public static event MouseEventHandler MultiCursorMouseMove
)。
它模拟图形图,我们当前的应用程序显示大约30-40个图形图。该事件的目的是在所有显示的图形上绘制光标,以指示鼠标光标指向时图形的值。
我遇到的问题是,因为Plotter
实例有这个静态事件,它们拒绝死亡。正如我在内存分析器中看到的那样,Plotter
的每个实例(以及包含它们的Form)都由与此MultiCursorMouseMove
事件绑定的EventHandler
保存在内存中。我已经编写了在每个Plotter
实例上运行Dispose
方法的设置,其中包括从MultiCursorMouseMove
中删除委托,但它似乎没有做任何好事。根据我通过调试器看到的,Plotter.MultiCursorMouseMove
注册为空,但这些实例仍然没有被收集,并且,我可以通过分析器告诉你,由于MultiCursorMouseMove
,所有实例继续存在。
所以,我的问题是,是否有任何方法可以明确地声明"删除与此事件相关的所有委托"?
我想这样我就可以确保我摆脱了所有这些,更不用说它将简化与我目前的代码相比的事情,在Dispose
方法期间,循环通过选项卡上的所有控件,并在所有Plotter
对象上运行Dispose
。
所以,我的问题是,有没有办法明确地说明"删除与此事件相关的所有委托"?
你试过显式设置"MultiCursorMouseMove"为空吗?
您可以扩展您的事件语法来跟踪添加/删除调用,以找出那些没有取消订阅的对象:
public static event MouseEventHandler MultiCursorMouseMove
{
add
{
}
remove
{
}
}
你也可以遵循弱事件模式,或者J. Richter描述的模式。弱处理程序基于弱引用,它不会阻塞GC。
最后,您可以使用硬核反射方法来清理静态MouseEventHandler对象中的委托数组。