C# 从ObservableCollection中清除数据

C# 从ObservableCollection中清除数据,c#,.net,wpf,observablecollection,C#,.net,Wpf,Observablecollection,我有一个类,它存储一个图像及其文件名。我已经创建了此类的ObservableCollection,并将其绑定到WPF列表框。这是一种图像查看器 我加载了50兆的数据,目前大约有10个图像,然后我想从可观察的集合中删除一个、部分或全部图像,并替换它们,这样在滚动许多图像时,内存占用不会变得太大 首先,我实际上在GUI上有一个按钮来加载接下来的10个图像——确实如此,但它的内存占用增加了一倍。我已尝试调用集合中的.Clear和.ClearItems,以及.Remove和.removetn,但内存没有

我有一个类,它存储一个图像及其文件名。我已经创建了此类的ObservableCollection,并将其绑定到WPF列表框。这是一种图像查看器

我加载了50兆的数据,目前大约有10个图像,然后我想从可观察的集合中删除一个、部分或全部图像,并替换它们,这样在滚动许多图像时,内存占用不会变得太大

首先,我实际上在GUI上有一个按钮来加载接下来的10个图像——确实如此,但它的内存占用增加了一倍。我已尝试调用集合中的.Clear和.ClearItems,以及.Remove和.removetn,但内存没有减少。我是不是不太理解ObservableCollection是如何工作的

以下是我的代码摘要:

加载图像后,通过以下方式将其传递到GUI:

listBox.DataContext=图像

我希望我已经清楚了。。。如果我需要补充什么,请告诉我


编辑:现在,我似乎已经通过覆盖ObservableCollection中的一个项目解决了这个问题,而不是试图删除/清除它,然后添加一个新的项目。但是我仍然不理解内存问题。

为什么不创建自己的视图模型类,比如ImageDataViewModel,并创建它的可观察集合,而不是从可观察集合继承

public class ImageDataViewModel : INotifyPropertyChanged, IDisposable { private string _id; private string _imagePath; public string Id { get { return _id; } set { _id = value; OnPropertyChanged("Id"); } } public string ImagePath { get { return _imagePath; } set { _imagePath = value; OnPropertyChanged("ImagePath"); } } private void OnPropertyChanged(string propertyName) { if(PropertyChanged!=null) { PropertyChanged(this,new PropertyChangedEventArgs(propertyName)); } } public void Dispose() { //Do dispose of resources. } public event PropertyChangedEventHandler PropertyChanged; } public class YourViewModel : INotifyPropertyChanged, IDisposable { private ObservableCollection _images; public ObservableCollection Images { get { return _images; } set { _images = value; OnPropertyChanged("Images"); } } private void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public event PropertyChangedEventHandler PropertyChanged; public void Dispose() { Images = null; } }
为什么不创建自己的视图模型类,比如ImageDataViewModel,并创建它的可观察集合,而不是从可观察集合继承

public class ImageDataViewModel : INotifyPropertyChanged, IDisposable { private string _id; private string _imagePath; public string Id { get { return _id; } set { _id = value; OnPropertyChanged("Id"); } } public string ImagePath { get { return _imagePath; } set { _imagePath = value; OnPropertyChanged("ImagePath"); } } private void OnPropertyChanged(string propertyName) { if(PropertyChanged!=null) { PropertyChanged(this,new PropertyChangedEventArgs(propertyName)); } } public void Dispose() { //Do dispose of resources. } public event PropertyChangedEventHandler PropertyChanged; } public class YourViewModel : INotifyPropertyChanged, IDisposable { private ObservableCollection _images; public ObservableCollection Images { get { return _images; } set { _images = value; OnPropertyChanged("Images"); } } private void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public event PropertyChangedEventHandler PropertyChanged; public void Dispose() { Images = null; } }
可能是垃圾收集器尚未从内存中删除映像对象。原因可能是系统上有足够的可用内存,因此不需要删除对象

当您加载接下来的10个图像以及之后的10个图像时,内存消耗是否继续增加


你也应该考虑像Rakesh Gunijan建议的那样处理图像。

可能是垃圾回收器还没有从内存中删除图像对象。原因可能是系统上有足够的可用内存,因此不需要删除对象

当您加载接下来的10个图像以及之后的10个图像时,内存消耗是否继续增加


你也应该考虑像Rakesh Gunijan建议的那样处理图像。

你是否处理了从集合中移除的图像?我需要吗?在上面ObservableCollection的加载中,我加载ImageData imgData=ImageData.Loadfilename;但我没有明确地处理这个问题。它不应该持续存在,是吗?您是否处理从集合中删除的图像?我需要吗?在上面ObservableCollection的加载中,我加载ImageData imgData=ImageData.Loadfilename;但我没有明确地处理这个问题。它不应该持续下去,是吗?嗯,这对OP的记忆问题没有任何帮助。如果您认为它确实有帮助,请指出,why.IMHO,您应该在视图中而不是在视图模型中创建ImageData对象。这将消除对对象的处理,使应用程序更加干净。如果需要,在字符串ImagePath属性之间实现转换器。还有UI图像对象。哇,我要花一段时间才能弄清楚这里到底发生了什么!这对很多人来说还是新鲜事。谢谢你的回复,我会调查的。@Zotty-尽量使应用程序简单。ViewModel不应加载图像对象。它负责查看加载图像对象。ViewModel应该只维护字符串形式的图像路径。这将消除您面临的所有内存问题。或者用简单的语言来解释,你的代码不适合WPF编程。我想你说的“适合”是指它不符合最佳实践?我想我理解你删除加载到视图中的图像的意思-我会看看是否可以调整我的程序来做到这一点。它可能会解决我遇到的其他一些问题!我以前没见过View和ViewModel,我会去读一些书。谢谢这对OP的记忆问题没有任何帮助。如果您认为它确实有帮助,请指出,why.IMHO,您应该在视图中而不是在视图模型中创建ImageData对象。这将消除对对象的处理,使应用程序更加干净。如果需要,在字符串ImagePath属性之间实现转换器。还有UI图像对象。哇,我要花一段时间才能弄清楚这里到底发生了什么!这对很多人来说还是新鲜事。谢谢你的回复,我会调查的。@Zotty-尽量使应用程序简单。ViewModel不应加载图像对象。它负责查看加载图像对象。ViewModel应该只维护字符串形式的图像路径。这将消除您面临的所有内存问题。或者用简单的语言来解释,你的代码不适合WPF编程。我想你说的“适合”是指它不符合最佳实践?我
我想我理解你将图像加载到视图中的意思-我会看看是否可以调整我的程序来实现这一点。它可能会解决我遇到的其他一些问题!我以前没见过View和ViewModel,我会去读一些书。谢谢它会不断为下面的每一组映像添加内存—不过我有8Gb的ram,因此您可能对垃圾收集器有一点看法。您可以尝试为应用程序设置MaxWorkingSet,以限制它可以分配多少ram。尝试使用Process.GetCurrentProcess.MaxWorkingSetNo,等等!这不会设置内存限制。看看这个问题,看看有没有一种方法可以强制执行一个限制:在阅读你的第二条评论之前,我试着加载2gb的数据,在50mb的块中,根本没有任何垃圾收集的证据。它确实不断为下面的每一组图像添加内存-尽管我有8Gb的ram,因此,关于垃圾收集器,您可能有一个观点:您可以尝试为应用程序设置MaxWorkingSet,以限制它可以分配多少ram。尝试使用Process.GetCurrentProcess.MaxWorkingSetNo,等等!这不会设置内存限制。看看这个问题,看看有没有一种方法可以强制执行一个限制:在阅读你的第二条评论之前,我试着以50mb的块加载2gb的数据,但根本没有任何垃圾收集的证据。