除非手动设置为null,否则ObservableCollection不会收集垃圾

时间:2016-10-31 08:14:21

标签: c# wpf xaml mvvm garbage-collection

在WPF应用程序中,我有一个XAML窗口,它打开另一个窗口并将其DataContext设置为ViewModel类的实例。除此之外,视图中的ListView绑定到ViewModel中的ObservableCollection。

ViewModel在初始化时加载大约7,000个项目,ListView显示它们(在VirtualizedStackPanel中)。

在VS2015的调试性能监视器中,我注意到在第二个窗口关闭后,并且没有更多的引用(据我所知)到包含7,000个项目的ViewModel,这些项目仍然存在于内存中。他们在第0代,第1代和第2代的几个垃圾收集中幸存下来(并且它们不在LOH中)。

经过长时间的调查,我发现当窗口关闭时将7,000个项目的集合设置为null,并确保引发OnPropertyChanged事件,导致立即收集这些项目集合。试图将这个集合跟在VS堆快照工具的根源是不可能的,因为它们被认为与一堆XAML控件和元素相关联。

我的问题是:这是正常行为吗?你必须一直把我的物品归零吗?我能错过什么?

1 个答案:

答案 0 :(得分:0)

最可能的原因是你在第二个XAML窗口视图中完成了某些,它在ViewModel上以非弱的方式订阅了一个事件。您无需担心Windows执行的View-to-VM订阅,因为默认情况下它们很弱,因此它们不会泄漏。我首先要查找您编写的可能订阅VM事件的行为,例如ObservableCollection.CollectionChangedICommand.CanExecuteChanged