2012-02-05 97 views
1

更新 手动运行垃圾回收清除内存中,因此,这是不是一个真正的“泄漏”本身我该如何解决这个图像内存泄漏?

我有我通过各种.jpg图像的Web URL的图像浏览器页面。当我使用Windows Phone性能分析工具运行此操作时,每次加载新图像时我使用的内存都会启动starircasing(12张图像让我达到50MB)。我尝试使用此处显示的方法清除图像缓存http://blogs.msdn.com/b/swick/archive/2011/04/07/image-tips-for-windows-phone-7.aspx,但它似乎不起作用。

图像查看器:

<!--ContentPanel - place additional content here--> 
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
    <Image x:Name="ThumbnailImage" Height="275" Margin="0,0,0,12"/> 
</Grid> 

后面的代码:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    string imageurl; 
    if (NavigationContext.QueryString.TryGetValue("imageurl", out imageurl)) 
    { 
     BitmapImage bitmapImage = ThumbnailImage.Source as BitmapImage; 

     if (bitmapImage != null) 
      bitmapImage.UriSource = null; 

     ThumbnailImage.Source = null; 
     ThumbnailImage.Source = new BitmapImage(new Uri(imageurl)); 
    } 
    } 
+0

您确定它是内存泄漏吗?尝试在OnNavigatedTo末尾调用GC.Collect()然后调用GC.WaitForPendingFinalizers(),并查看内存消耗是否持续增加。 – 2012-02-06 07:59:26

+0

嗯有趣的GC呼叫清除记忆。我想我的问题应该是:为什么当系统超过90MB时系统不会自动调用垃圾回收? – kbeal2k 2012-02-08 04:02:12

回答

0

你留着处置的形象和重新初始化。只需执行以下操作:

string imageurl; 
if (NavigationContext.QueryString.TryGetValue("imageurl", out imageurl)) 
    ThumbnailImage.Source = new BitmapImage(new Uri(imageurl)); 
+1

根据内存分析器,这似乎没有改变任何东西。 – kbeal2k 2012-02-05 21:55:11

2

系统在它认为需要时调用GC。基于.NET的桌面版本,有两个主要条件:

  • 当(自上次垃圾收集那些创建)0代对象的数量得到了预定数量
  • 当可用内存变得如此之低它开始有危险

我不知道Windows Phone垃圾回收器的条件是什么,但总体而言,除非开始获取OutOfMemory异常,否则不应该担心内存。

+1

我担心该应用超过90MB限制时未通过认证。似乎很愚蠢的是必须手动调用GC来满足他们的期望。 – kbeal2k 2012-02-08 13:45:29

0

我相信这个问题是由于你不断地创建新的BitmapImage对象,这些对象是基于GDI +的部分非托管的。这是一个相当普遍的问题,可以通过重用相同的BitmapImage对象来纠正。然而,考虑到你的应用程序的设计,使用替代BitmapImage类中的构建可能更容易。每当我需要对WP7上的图像执行任何操作时,我总是使用ImageTools。输出可以直接用于控制,并且性能更高(并且具有预期的GC特性)