在WPF 4中仍然存在的内存泄漏

Ibr*_*jar 8 .net c# wpf

我打算建立一个WPF MVVM业务应用框架,这样做的谈论在WPF平台的内存泄漏的研究时,我遇到了许多文章.

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

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

换句话说,在构建我的框架或一般情况下(WPF 4.0,.NET 4.0)时,可能会出现哪些内存泄漏(可能会发生)?

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

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

Dom*_*nik 8

首先出现在我的脑海里:

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

您在开始之前考虑这一点的事实是一个加分,投资一个好的MemoryProfiler并定期从一开始就配置您的应用程序,你会没事的.

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

  • 实现INotifyPropertyChanged是必须的.你的第一个开发人员告诉你"我只是一个静态视图,我的模型上的数据不会改变,我只是跳过了INPC"必须在公共场合进行绘制和分区.更好的是,您的框架应该强制实现此接口,或者至少使开发人员尽可能轻松地使用它.
  • 不要绑定到PropertyDescriptors,这可能在一开始可能并不明显,但是您的Framework可能会为开发人员设置路径,仅将其用于绑定到自定义viewmodel属性.
  • 始终取消注册您的事件处理程序,我认为这更像是代码卫生问题

关于弱事件的编辑,是的,这可能有用.就个人而言,我不会考虑这种良好做法,因为它可能会导致您的模型暴露您注册的事件的时间比您预期的要早.我建议加倍努力,有意识地取消注册您的处理程序.