您可能想检查是否有遗留事件处理程序。
如果你在其他控件中注册了一个事件,垃圾收集器不会收集不再需要的对象,因为可以说事件仍然是附加的。
所以如果你在代码后面的某处注册了 Loaded
public ParentEditor()
{
InitializeComponents();
control.Loaded += OnControlLoaded;
}
或在 XAML 或 ParentControl 中
<Control Loaded="OnControlLoaded" />
你基本上有两种解决方案来解决这个问题:
解决方案 1 - 在不再需要事件处理程序时删除它们:
您可能希望在卸载父控件时删除此处理程序,如下所示:
public ParentEditor()
{
InitializeComponents();
control.Loaded += OnControlLoaded;
this.Unloaded += OnParentUnloaded;
}
void OnParentUnloaded(object sender, RoutedEventArgs e)
{
//Remove unloaded event
this.Unloaded -= OnParentUnloaded;
//Remove event from child control
control.Loaded -= OnControlLoaded;
}
您当然也可以使用子控件的 Unloaded 事件.. 这取决于您..
解决方案 2 - 使用 WeakEvent 模式:
另一个事件解决方案是WeakEvent 模式,它绕过了这个问题。
为什么要实施 WeakEvent 模式?
监听事件会导致
内存泄漏。典型技术
听一个事件就是使用
特定于语言的语法
将处理程序附加到 a 上的事件
资源。例如,在 C# 中,
语法是:source.SomeEvent += new
SomeEventHandler(MyEventHandler)。
这种技术创造了一个强大的
从事件源引用到
事件监听器。通常情况下,附加
侦听器的事件处理程序导致
听者有一个对象
受对象影响的寿命
源的生命周期(除非
事件处理程序被显式删除)。
但在某些情况下,您可能
想要对象的生命周期
监听器只能由
其他因素,例如是否
当前属于视觉树
的应用程序,而不是由
源的生命周期。每当
源对象的生命周期超出
侦听器的对象生命周期,
正常的事件模式导致
内存泄漏:监听器被保留
比预期的寿命更长。
在任何一种情况下,祝你好运.. 很难找到像您正在经历的泄漏!