【问题标题】:Why does implementing INotifyPropertyChanged avoid memory leaks in WPF?为什么实现 INotifyPropertyChanged 可以避免 WPF 中的内存泄漏?
【发布时间】:2020-08-29 12:28:37
【问题描述】:

我了解了如何在 Windows Presentation Foundation 应用程序中通过仅绑定实现 INotifyPropertyChanged 或它们是 DependencyObject 对象的属性来避免内存泄漏。但这如何让 CLR 收集这些对象呢?

来源信息:

WPF 绑定实际上会导致内存泄漏。经验法则是始终绑定到 DependencyObject 或 INotifyPropertyChanged 对象。如果您不这样做,WPF 将从静态变量创建对绑定源(即 ViewModel)的强引用,从而导致内存泄漏 (https://michaelscodingspot.com/ways-to-cause-memory-leaks-in-dotnet/)

【问题讨论】:

  • 尝试在 StackOverflow 中搜索 [wpf] INotifyPropertyChanged memory leaks
  • 我在 SO 上发现了一些关于此的帖子有死链接或不是非常有用的链接。有一个解释为什么你(可能)在这里泄漏:blog.jetbrains.com/dotnet/2014/09/04/…

标签: c# wpf memory-leaks


【解决方案1】:

如果一个属性没有实现 INotifyPropertyChanged 接口,那么 WPF 框架会愚蠢地通过订阅 PropertyDescriptor.ValueChanged 事件为您添加一个。由于 WPF 和 CLR 不知道何时处理/取消订阅事件,因此它永远保留该属性。并且由于该属性被引用,它不能被垃圾收集。包含该属性的类的整个实例永远留在内存中,从而导致内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-26
    • 2018-04-08
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多