C# 从ObservableCollection中清除数据
我有一个类,它存储一个图像及其文件名。我已经创建了此类的ObservableCollection,并将其绑定到WPF列表框。这是一种图像查看器 我加载了50兆的数据,目前大约有10个图像,然后我想从可观察的集合中删除一个、部分或全部图像,并替换它们,这样在滚动许多图像时,内存占用不会变得太大 首先,我实际上在GUI上有一个按钮来加载接下来的10个图像——确实如此,但它的内存占用增加了一倍。我已尝试调用集合中的.Clear和.ClearItems,以及.Remove和.removetn,但内存没有减少。我是不是不太理解ObservableCollection是如何工作的 以下是我的代码摘要: 加载图像后,通过以下方式将其传递到GUI: listBox.DataContext=图像 我希望我已经清楚了。。。如果我需要补充什么,请告诉我C# 从ObservableCollection中清除数据,c#,.net,wpf,observablecollection,C#,.net,Wpf,Observablecollection,我有一个类,它存储一个图像及其文件名。我已经创建了此类的ObservableCollection,并将其绑定到WPF列表框。这是一种图像查看器 我加载了50兆的数据,目前大约有10个图像,然后我想从可观察的集合中删除一个、部分或全部图像,并替换它们,这样在滚动许多图像时,内存占用不会变得太大 首先,我实际上在GUI上有一个按钮来加载接下来的10个图像——确实如此,但它的内存占用增加了一倍。我已尝试调用集合中的.Clear和.ClearItems,以及.Remove和.removetn,但内存没有
编辑:现在,我似乎已经通过覆盖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的数据,但根本没有任何垃圾收集的证据。