C# ObservableCollection内存泄漏Windows Universal

C# ObservableCollection内存泄漏Windows Universal,c#,memory-leaks,observablecollection,windows-rt,windows-8.1-universal,C#,Memory Leaks,Observablecollection,Windows Rt,Windows 8.1 Universal,我的Windows(8.1)通用项目内存泄漏。因为我的项目非常大,所以我创建了一个小样本项目,其唯一目标是模拟内存泄漏。我尝试了很多方法来解决这个内存泄漏问题,但都没有用 情况如下:应用程序包含一个列表,当单击按钮时,数据将添加到列表中,当单击第二个按钮时,列表将被清除。当项目被添加到列表中时,我希望看到内存使用量增加,这确实发生了。但是,当我清除列表时,我希望看到内存使用率下降到添加项之前的水平。这种情况不会发生。相反,内存使用量比添加项之前高出约MB(显然取决于添加到列表中的项的数量) 你能

我的Windows(8.1)通用项目内存泄漏。因为我的项目非常大,所以我创建了一个小样本项目,其唯一目标是模拟内存泄漏。我尝试了很多方法来解决这个内存泄漏问题,但都没有用

情况如下:应用程序包含一个列表,当单击按钮时,数据将添加到列表中,当单击第二个按钮时,列表将被清除。当项目被添加到列表中时,我希望看到内存使用量增加,这确实发生了。但是,当我清除列表时,我希望看到内存使用率下降到添加项之前的水平。这种情况不会发生。相反,内存使用量比添加项之前高出约MB(显然取决于添加到列表中的项的数量)

你能帮我解决这个问题吗

这是将项目添加到列表中的代码:

    private Custom_Observable_List leaking_items_list = new Custom_Observable_List();
    private void AddItemsToList()
    {
        if (RESET_LIST_BEFORE_ADDING)
        {
            ClearItemsList();
        }

        if (ItemList.ItemsSource == null)
        {
            ItemList.ItemsSource = leaking_items_list;
        }

        for (int i = 0; i < AMOUNT_OF_ITEMS_TO_ADD; i++)
        {
            leaking_items_list.Add(new ObjectClass() { Content = ITEM_CONTENT + number_of_items_added });
            number_of_items_added++;
        }
    }
    private void ClearItemsList()
    {
        if (leaking_items_list.Count > 0)
        {
            leaking_items_list.Clear();
        }
    }
自定义可观察列表类:

class Custom_Observable_List : ObservableCollection<ObjectClass>
{
    public Custom_Observable_List()
    {
    }

    public Custom_Observable_List(IEnumerable<ObjectClass> collection) : base(collection)
    {
    }
}
我也尝试过向列表中添加字符串,当时也发生了内存泄漏。我在某个地方读到应该实现INotifyPropertyChanged,这就是我创建这个类的原因

整个项目可在此处找到:


我使用visual studio 2015及其诊断工具进行了测试。我已经证实,添加和清除两次后,程序会崩溃,因为内存使用率太高。

如果程序在您停止使用对象的那一刻释放内存,则会大大降低程序的速度。使用内存分析器,如(它与WinRT应用程序配合使用,并附带免费的5天试用版),查看您是否真的有内存不足,或者您是否需要等待更长的时间,等待GC确定实际执行清理是否有益。如果确实存在内存泄漏,DotMemory将帮助您找出是什么保持了引用,从而使对象比应该保持的时间更长。
class ObjectClass : INotifyPropertyChanged
{
    private string content = string.Empty;

    public string Content
    {
        get { return content; }
        set
        {
            if (content != value)
            {
                content = value;
                NotifyPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}