ObservableCollection内存泄漏

时间:2015-01-09 15:35:59

标签: c# wpf mvvm memory-leaks observablecollection

我在我的应用程序中使用MVVM灯。 我不知道如何释放ObservableCollection的内存这是我的ViewModel:

    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”时,它会为我的视图创建一个新的viewModel。我有另一个按钮来清除observableCollection。

如果我分配一个新的viewModel或者如果我清除了ObsevableCollection,那么内存永远不会释放。 对于这个例子,每次点击“bt_test”需要多15Mo。在我的应用程序中,每次需要50兆,我在测试中达到了1.4Go消耗...(我停止了测试)

你能帮助我吗?

编辑:

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

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

1 个答案:

答案 0 :(得分:0)

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

试一试。希望这会有所帮助。