2012-02-05 88 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特性)

相關問題