我对WPF比较陌生,其中一些东西对我来说很陌生。 首先,与Windows Forms不同,WPF控件层次结构不支持IDisposable。在Windows Forms中,如果用户控件使用了任何托管资源,则通过重写每个控件实现的Dispose方法非常容易清理资源。
在WPF中,情况并不那么简单。我已经搜索了几个小时,遇到了两个基本主题:
第一个主题是Microsoft明确表示,WPF不实现IDisposable,因为WPF控件没有非托管资源。虽然这可能是真的,但他们似乎完全忽视了用户对其WPF类层次结构的扩展可能实际上使用托管资源(直接或通过模型间接使用)。通过不实现IDisposable,Microsoft已经有效地删除了唯一可以清理自定义WPF控件或窗口所使用的非托管资源的保证机制。
其次,我发现了几个关于Dispatcher.ShutdownStarted的参考文献。我尝试使用ShutdownStarted事件,但它似乎不能为每个控件触发。我有许多WPF UserControl,我已经为ShutdownStarted实现了处理程序,但它从未被调用过。 我不确定它是否仅适用于Windows,或者可能是WPF App类。但是它没有正确触发,每次应用程序关闭时我都会泄漏打开的PerformanceCounter对象。
除了Dispatcher.ShutdownStarted事件外,是否有更好的清理非托管资源的替代方法?是否有某种技巧实现IDisposable以调用Dispose?如果可能的话,我非常希望避免使用终结器。