长话短说,这是一个大型WPF项目
我有一个实现INotifyPropertyChanged
的类"Patient"。当我处理这个类时,我检查PropertyChangedEventHandler
是否为空,如果不将其运行到记录侦听器的ListenerDetector
类,以便我们可以跟踪它们并清除泄漏。Patient确实有一些属性绑定到WPF元素以及其他对象,使用它的PropertyChanged
来监视变化。
处理完其他内容后,日志结果如下:
日志:患者仍然有以下侦听器附加:-
System.ComponentModel.PropertyChangedEventManager
问题:什么时候创建PropertyChangedEventManager
?
- 当患者被创建时
- 当WPF绑定到Patient属性时
- 另一个观点。
如果Patient.PropertyChangedEventHandler
被设置为null
,因此与PropertyChangedEventManager
断开连接,是否有任何方法可以重新创建管理器并使其再次侦听Patient.PropertyChangedEventHandler
?请不要问为什么会发生这种情况,这是这里的一个紧张点:
PropertyChangedEventManager
是WPF为了支持绑定到任何实现INotifyPropertyChanged
的类而创建的。当您绑定到任何实现INotifyPropertyChanged
的类时,它将被创建和使用。
也就是说,它是WeakEventManager模式的一个实现。虽然它仍然显示了一个附加的侦听器,但要注意这个侦听器是使用弱事件模式附加的。一旦发生完整的垃圾收集,这个问题就会消失,因为它使用弱引用来保存订阅。因此,这个特定的订阅不应该是(长期)内存泄漏的原因。