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