ListCollectionView泄漏内存吗?

Geo*_*off 11 c# wpf memory-leaks mvvm listcollectionview

我一直在研究如何避免因INotifyCollectionChanged视图模型对事件的强引用而导致的内存泄漏.我正在玩一个ListCollectionView用来查看是否会为我处理它.我认为以下是泄漏记忆,我做错了什么?

var stuff = new ObservableCollection<string>();
while (true)
{
    var result = new ListCollectionView(stuff);
    // Just to keep make sure that the memory I'm seeing 
    // isn't waiting to be GC'd
    GC.Collect(); 
}
Run Code Online (Sandbox Code Playgroud)

jco*_*and 10

我最初将此作为评论发布,但我认为这是一个更好的答案,所以...

a)如果您确定您发现.NET框架存在问题,那么您可能做错了什么.这不是不可能的,只是不太可能.b)GC.Collect()不会按照你的想法去做.

我想你需要回顾一下GC.Collect()的工作原理.


MSDN GC.Collect方法

备注

使用此方法尝试回收所有无法访问的内存.

所有对象,无论它们在记忆中存在多长时间,都被考虑收集; 但是,不会收集托管代码中引用的对象.使用此方法强制系统尝试回收最大可用内存量.


对于初学者,你没有告诉我们你在哪里处理那个记忆ListCollectionView(stuff).你只是分配新的和分配新的,但你永远不会丢弃旧的.所以,是的,它会像疯了一样泄漏.在GC运行并尝试收集之前.

如果你做同样的事情,你在这里展示一个字符串列表,它很可能会做同样的事情.但是对于你所展示的东西,我预计它会泄漏.


Bri*_*arm 9

文档ListCollectionView不是很好,但如果你注意到有一种方法DetachFromSourceCollection.这个电话的评论提到取消订阅并允许垃圾收集.

    var stuff = new ObservableCollection<string>();
    while (true)
    {
        ListCollectionView result = new ListCollectionView(stuff);

        //Use this method to unsubscribe to events on the underlying collection and allow the CollectionView to be garbage collected.
        result.DetachFromSourceCollection();
        //When finished set to null
        result = null;
        GC.Collect();
    }
Run Code Online (Sandbox Code Playgroud)

  • @Geoff,这应该是您想要的答案。`DetachFromSourceCollection`是您的ViewModel应该调用的东西。如果您不创建`ListCollectionView`,则无需做任何事情(例如,直接绑定到`ObservableCollection`)。您只应担心您的集合未实现`INotifyPropertyChanged`(因为它会[泄漏](http://stackoverflow.com/q/19511341/1997232))。 (2认同)