我们有一个派生自FrameworkElement的类,它不在我们的控制之下。 该类在OnInitialize方法中注册事件处理程序。
正确清理此类的模式是什么,因为FrameworkElement不提供OnInitialize的对应项?
它仍然有根,因为它的任何部分都不会删除导致泄漏的EventHandler。
答案 0 :(得分:3)
没有“去初始化”这样的东西。当无法在其构造函数中完全初始化对象时,将使用初始化方法,因为它依赖于构造期间不可用的数据。在这些情况下,构造分为两个阶段:第一步在无参数构造函数中执行,第二步在初始化方法中执行,如OnInitialize
,在外部数据可用后
您描述的是对象处理,它通过调用对象的Dispose
方法来执行。一个编写良好的类应该清理其数据,释放任何外部资源和释放任何事件处理程序。
视觉元素通常在其生命周期中有另一个步骤,由OnLoad / OnUnload方法处理。当元素实际放置在XAML视图中并连接到其他UI元素时,会发生“加载”步骤。事件处理程序应在OnLoad方法中注册,并在OnUnload方法中删除。
如果元素没有Dispose
方法,你可以引发Unload事件来强制清除,虽然这有点像黑客攻击:
control.RaiseEvent(new RoutedEventArgs(FrameworkElement.UloadedEvent))
答案 1 :(得分:1)
使用弱事件模式。特别是,使用WeakEventManager
实现订阅事件(或者,更好的是,它的通用版本WeakEventManager<TEventSource, TEventArgs>
,如果.NET 4.5是一个选项)。
答案 2 :(得分:0)
使用 Dispatcher.ShutdownStarted
事件。
将其添加到构造函数中:
Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
并将您的清理代码添加到此方法中:
private void Dispatcher_ShutdownStarted(object sender, EventArgs e)
{
Stop();
}