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