C# 包含大量项目和图像的列表框占用了太多内存

C# 包含大量项目和图像的列表框占用了太多内存,c#,windows-phone-7,memory,listbox,virtualization,C#,Windows Phone 7,Memory,Listbox,Virtualization,我有一个透视图,有6个透视项目。每个数据透视项都包含一个电影列表。每部电影都有一个封面图片,旁边有一个标题和一些其他元数据。要按照我的想法设计这个样式,显然必须使用一些网格/堆叠面板。此外,我还有一个每个项目的上下文菜单。在我的列表框上方,我有一个性能进度条,可以在加载数据时显示(我从web API获取所有信息)。我的问题是其中一个列表包含的电影比其他列表多得多,大约100部。加载此列表时,应用程序使用大约150-160 mb的内存,超过了90 mb的限制。看起来所有的图像和内容都马上被加载了(

我有一个透视图,有6个透视项目。每个数据透视项都包含一个电影列表。每部电影都有一个封面图片,旁边有一个标题和一些其他元数据。要按照我的想法设计这个样式,显然必须使用一些网格/堆叠面板。此外,我还有一个每个项目的上下文菜单。在我的列表框上方,我有一个性能进度条,可以在加载数据时显示(我从web API获取所有信息)。我的问题是其中一个列表包含的电影比其他列表多得多,大约100部。加载此列表时,应用程序使用大约150-160 mb的内存,超过了90 mb的限制。看起来所有的图像和内容都马上被加载了(我认为这会导致这个问题)

我想要的是:

首先加载标题和元数据,然后仅在用户当前位于列表中的位置加载图像,以便在用户向下滚动到列表之前不会加载列表中较长的图像

我尝试过使用DelferredLoadList、lazylist和normal listbox,我尝试过将虚拟化设置为标准化和循环使用,但没有结果。我必须承认,我不知道这些东西到底是干什么的。有人知道我怎么解决这个问题吗?提前谢谢

另外,listbox的xaml代码有点笨重,所以我决定不在本文中包含它。如果你真的需要看它来帮助我,请告诉我


更新:我已经能够通过使用虚拟化列表框来减少内存使用,但它仍然在100MB左右。我在某个地方读到设置bitmapImage.ImageSource=null;使用完图像后,会将其从内存中清除。当每个图像位于列表框中时,如何对其执行此操作?

您是否尝试过惰性图像下载

public class ItemViewModel 
{
   private BitmapImage _image;
   public BitmapImage Image 
   {
      get{

      if(_image == null)
      {
         _image = new BitmapImage();
          StartDownloadImageAsync();
      }
       return _image;
      }
   }
}
下载图像后,将其设置为_image并调用RaisePropertyChanged(“图像”); 因此,在Vitruized listbox上,您将只下载可见项目的图像


如果您这样做了,您可以尝试对列表进行分页。

列表框本身不会占用太多内存。是ListBoxItems的内容起作用。虚拟化面板仅创建可见的ListBoxItems(再加上一些),并销毁屏幕外的ListBoxItems。因此,请确保ListBox使用虚拟化面板,例如,不设置ListBox.ItemsPanel


对于虚拟化,面板需要有一个受限的大小-否则它将创建所有ListBoxItems。通常,这是通过将列表框放入网格或通过设置宽度/高度来为其指定受约束的大小来实现的。但是,如果您将ListBox放在一个非约束容器(例如ScrollViewer、StackPanel等)中,则ListBox的大小是无限的,ItemsPanel将根据需要增长,并创建所有ListBoxItems,即使它们远离屏幕。

感谢您的回复。我还没试过,现在就试。我想我忘了提一下,即使没有图像,内存消耗也是相当大的。你知道我还能做些什么来降低它吗?你应该简化你的xaml。删除所有未使用的数据模板和样式,尝试使用StackPannel而不是网格,并注意内存泄漏(如果您订阅了某个事件,请不要忘记取消订阅等),以及您的图像有多大?如果您的web服务允许,您可以尝试下载缩略图而不是全尺寸图像。图像没有那么大,因此我认为这不是问题所在。请查看Memory Profiler(),可能还有其他问题吗?请在pastebin.com中共享您的xaml代码,以便我可以复制并建议一个干净的解决方案。对不起,我整个周末都不在。这看起来很有帮助。谢谢,我现在试一试。当我删除-标记时,上下文菜单似乎不起作用。但即使这样,由于listbox位于网格中,整个listbox也会立即加载。在这种情况下,我建议您尽可能简化页面和数据模板。您不应该看到任何内存使用情况。然后重新激活DataTemplate的各个元素,直到看到内存使用量明显增加。最后重新激活页面的元素,直到您看到内存使用量增加。在您的帮助下,通过减少从服务器获取的图像的大小,我能够将内存使用量减少到最大75 mb。我想我还可以做一些事情,但我会自己解决的。谢谢你的帮助!