我在我的应用程序中使用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());
答案 0 :(得分:0)
在this文章中,我读到WPC检查以查找实现INotifyPropertyChanged的内容。因此,要修复此内存泄漏,如果您不需要PropertyChanged事件,则只需要在ViewModel中实现 INotifyPropertyChanged 。
试一试。希望这会有所帮助。