【发布时间】:2010-08-20 09:30:35
【问题描述】:
在我们基于 Caliburn.Micro 构建的 SL4 应用程序中,我们遇到了(另一个)内存泄漏。
剥离出来,问题似乎是由 ItemsControl 引起的,其中自定义 DataTemplate 绑定到实现 INotifyPropertyChanged 接口的对象的 IEnumerable 集合。
当源集合改变时(另一个集合被分配给 ItemsControl 的 ItemsSource 绑定到的 ViewModel 的属性),原始集合中的实体和绑定的 DataTemplates 不会被垃圾回收。虽然 NotifyPropertyChanged 的事件处理似乎是通过 WeakReference 在内部完成的,但就像 SL 保留对这些对象的另一个引用一样。所以每次我们从服务器刷新数据时,内存消耗都会增加。
你知道如何解决这个问题吗? 我实在想不通SL4怎么会出现这种bug!
一些实验表明调用 ItemsControl.Items.Clear() 可能会有所帮助。任何提示如何在每次更改 ItemsSource 时简单地调用它?我唯一想到的就是重写 ItemsSourceProperty 并在那里添加一个处理程序。
编辑: 原来泄漏发生在这种情况下:
- 通过 RIA 服务上下文加载实体并将它们的集合存储在 viewmodel 的属性中
- 将带有自定义数据模板的列表视图绑定到带有实体集合的属性
- 通过 RIA 服务上下文刷新实体
发生的情况是,尽管在视图中可以看到实体被刷新,但内存消耗正在上升。
如果没有绑定,刷新实体不会消耗更多内存(它可能会但内存消耗水平最终会在 GC 完成其工作时返回)。
如果你清除上下文或者只是创建一个新的,内存最终也会被收集。
问题似乎与 RIA 服务有关。
如果您愿意,我可以提供一个显示问题的简单项目。
更新:内存泄漏似乎是由 INotifyDataErrorInfo 引起的。阅读here。
【问题讨论】:
-
感谢您提醒我这个问题!你知道它是否发生在 WPF 中吗?
-
还没有。但是我会尝试为 WPF 和 SL 准备简单的演示来重现问题,所以我们会看到。你有同样的问题吗?到目前为止,似乎即使是 RIA 也可能会以某种方式影响问题......
-
只是为了确认一下:您是在没有附加调试器的情况下在发布模式下测试的,对吧?
-
@Kent 没关系。发布或调试模式,无论是否附加调试器,泄漏仍然存在。
标签: silverlight memory-leaks itemscontrol