【问题标题】:ObservableCollection memory leakObservableCollection 内存泄漏
【发布时间】:2015-03-07 23:29:41
【问题描述】:

我在我的应用程序中使用 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());

【问题讨论】:

  • 你如何测量内存使用情况?
  • 我使用了 VS2013 分析器和我的旧 TaskManager :-)
  • TaskManager 不是测量内存的好工具。让循环运行 10000 次,看看是否得到实际的 OOM 异常。
  • @Blam 是对的。分配内存的成本很高,因此 CLR 会保留它所需的尽可能多的内存,直到它不得不放手为止。除非您的应用程序按照他所说的那样得到 OOM,否则没有问题。
  • @eFloh 发布和实测不一样。任务管理器不是测量内存的好工具。如果它确实是内存泄漏,那么不,它不会被释放。

标签: c# wpf mvvm memory-leaks observablecollection


【解决方案1】:

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

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

【讨论】:

  • 我忘记了:我的 ViewModel 实现 ObservableObject 至极实现 INotifyPropertyChanged
猜你喜欢
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
  • 2011-10-31
  • 2019-08-10
  • 2013-06-24
相关资源
最近更新 更多