8

我正计划构建一个 WPF MVVM 业务应用程序框架,并且在研究 WPF 平台中的内存泄漏时遇到了许多文章。

在 Windows Presentation Foundation 中使用数据绑定时可能会发生
内存泄漏 使用 DataBinding (Black Magic) 避免 WPF 内存泄漏
严重内存泄漏瘟疫 WPF
WPF 和 Silverlight 中的 5 大内存泄漏
WPF 绑定错误导致可能的内存问题

但其中大多数可以追溯到 2007 年和 2008 年,所以我想知道其中哪些已经解决,哪些没有。

换句话说,在构建我的框架或一般情况下需要注意的内存泄漏(可能发生)的可能来源是什么(WPF 4.0、.NET 4.0)?

编辑:我会尝试更具体。我可以利用WeakEventManager及其子类来监听事件而不必开发自己的解决方案吗?

编辑2:更具体。我可以使用WeakEventManager.NET 来解决由 .NET 中的事件引起的内存泄漏问题,而不仅仅是 WPF 吗?如果是这样,为什么它是 WPF 命名空间的一部分,而不是一般的 .NET 命名空间?

4

1 回答 1

8

我首先想到的是:

  • System.Windows.Interactivity.Behavior 来自 System.Windows.Interactivity.dll:行为可能不会在您期望时分离,反之亦然,从而在控件上添加事件处理程序以在 gc 中继续存在
  • 仅根据您的描述,我很确定您将来会使用第三方组件,我们发现这是泄漏的一流候选者

您在开始之前考虑这一点是一个加分项,投资一个好的 MemoryProfiler 并定期从一开始就对您的应用程序进行分析,您会没事的。

编辑:评论您的编辑:检查您的链接我认为您可以隔离三个主要主题:

  • 实施 INotifyPropertyChanged 是必须的。您的第一个开发人员告诉您“只有一个静态视图,我的模型上的数据不会改变,我只是跳过了 INPC”必须在公共场合绘制和划分。更好的是,你的框架应该强制实现这个接口,或者至少让开发人员尽可能容易地使用它。
  • 不要绑定到 PropertyDescriptors,这可能一开始可能并不明显,但您的框架可能会再次为开发人员设置一条路径,仅使用它来绑定到自定义视图模型属性。
  • 总是注销你的事件处理程序,在我看来这更像是一个代码卫生问题

至于您对弱事件的编辑,是的,这可能有效。就我个人而言,我不会考虑这种良好做法,因为它可能会导致您的模型暴露您正在注册的事件被清理得比您预期的要早。我建议多走一步,有意识地注销您的处理程序。

于 2013-07-15T14:39:03.280 回答