2015-01-09 132 views
0

我在我的应用程序中使用MVVM light。 我不知道我可以释放一个ObservableCollection这里的记忆是我的ViewModel:ObservableCollection内存泄漏

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()); 
+0

你是如何测量内存使用量的? – Paparazzi

+0

我使用了VS2013分析仪和我的老TaskManager :-) – draco951

+2

TaskManager不是测量记忆的好工具。让循环运行10000次,看看你是否得到和实际的OOM异常。 – Paparazzi

回答

0

this文章,我读了WPC检查发现,执行INotifyPropertyChanged的事情。所以要解决这个内存泄漏问题,只需要实现INotifyPropertyChanged,如果你不需要PropertyChanged事件,也可以在你的ViewModel中实现。

试试看。希望这可以帮助。

+0

忘了这个:我的ViewModel实现了实现INotifyPropertyChanged的ObservableObject – draco951