您可能想检查是否有任何事件处理程序被遗留。
如果您在其他控制中注册了某个事件,garbadge收集器将不会收集不再需要的对象,因为事件仍然可以这样说。
所以,如果你注册代码的某个地方加载背后
public ParentEditor()
{
InitializeComponents();
control.Loaded += OnControlLoaded;
}
或XAML或ParentControl
<Control Loaded="OnControlLoaded" />
您basicly有两个解决方案来解决这个问题:
解决方案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;
}
您还可以使用过程中的子控件的空载情况下..这是给你..
解决方案2 - 使用WeakEvent模式:
事件另一种解决方案将是WeakEvent图案,它绕过这个问题。
为什么要实现WeakEvent模式?
聆听事件可能导致内存泄漏 。用于收听事件的典型技术 是使用 将处理程序附加到 源上的事件的语言特定语法。例如,在C#中, 的语法是:source.SomeEvent + = new SomeEventHandler(MyEventHandler)。
此技术创建从事件源到 事件侦听器的强引用 。通常,为听众附加一个事件处理程序 会导致 收听者有一个对象 影响对象的生命周期(除非明确地删除了 事件处理程序)。 但在某些情况下,你可能 希望被其他 因素,如是否 目前属于该应用程序的可视化树 ,而不是由 一生源的唯一控制的 监听的对象的生命周期。每当源对象的生命周期超出 时,监听器的对象生存期, 正常事件模式导致内存泄漏:监听器保持 比预期长。
在这两种情况下,好运 ..其很难找到像您所遇到的一个泄漏!
谢谢你的建议 - 非常有用!但是对于MVVM,甚至不使用事件处理程序。 viewmodel对gui一无所知,只是公开gui挂钩的命令。 – bluebit 2009-08-17 09:36:40