可观察集合内存泄漏

本文关键字:泄漏 内存 集合 观察 | 更新日期: 2023-09-27 18:37:06

我在应用程序中使用 MVVM light。我不知道如何释放可观察集合的内存这是我的视图模型:

    ObservableCollection<string> collTest = new ObservableCollection<string>();
    public VMTest()
    {
        for (int x = 0; x < 100000; x++)
            collTest.Add(String.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}", x, x, x, x, x, x, x, x, x, x));
    }
    public ICommand DeleteColl { get { return new RelayCommand(DeleteCollExecute, CanDeleteCollExecute); } }
    bool CanDeleteCollExecute() { return true; }
    void DeleteCollExecute()
    {
        collTest.Clear();
    }

观点 :

    <Grid>
        <StackPanel>
            <Button Click="Button_Click"
                    Name="bt_test"
                    Content="New VMTest" />
            <Button Content="delete ObservableCollection"
                    Command="{Binding DeleteColl}" />
        </StackPanel>
    </Grid>

背后的代码:

    public TestMemoryLeak()
    {
        InitializeComponent();
        this.DataContext = new VMTest();
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.DataContext = new VMTest();
    }

当我单击"bt_test"时,它将为我的视图创建一个新的视图模型。 我还有一个按钮来清除可观察集合。

如果我分配一个新的视图模型,或者如果我清除了 ObsevableCollection,内存永远不会释放。对于此示例,每次单击"bt_test"都需要多花费 15Mo 。 在我的应用程序上,每次需要 50 兆,我在测试中达到了 1.4Go 的消耗......(我停止了测试)

你可以帮我吗?

编辑:

经过调查,似乎是我的DAO有罪,有没有可能是我复制ObervableCollection的问题?

LocColl = new ObservableCollection<Localite>(Factory.getILocalite().ListLocalite());

可观察集合内存泄漏

在本文中,我读到WPC检查以查找实现INotifyPropertyChanged的内容。因此,要修复此内存泄漏,您只需要在您的 ViewModel 中实现 INotifyPropertyChanged 如果您不需要 PropertyChanged 事件。

试一试。希望这有帮助。