如何完全删除静态事件的所有项目

本文关键字:项目 事件 何完全 删除 静态 | 更新日期: 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对象中的委托数组。