2013-06-24 42 views
2

我想弄清楚爲什麼我的Windows Phone 7.1應用程序保持內存。該應用程序從SkyDrive下載全分辨率圖像。它將這些圖像連接到圖像元素並將其顯示在畫布上。我已經玩了一段時間(太長了!),最近重寫我的代碼,以手動下載圖像,因爲我正在使用BitmapImage.SetSource(新的URI(等))發生悲劇內存泄漏。現在好多了,但我仍然有漏洞。想知道是否有人可以在我的代碼中發現它,非常感謝!binaryreader內存泄漏windows phone 8

下面是從內存設置圖像: http://sdrv.ms/18aXLja(沒有足夠的口碑此處將圖片直接上傳,很抱歉)

下面是正在調用的代碼。此代碼由指向圖像URL的WebClient實例的OpenReadCompleted事件觸發。此代碼針對圖表中的每個圖像加載運行(確切說是56次)。我無法弄清楚的是: - 爲什麼內存流在關閉後仍保留在內存中(圖像中沒有顯示的是Heap中有一個單獨的分配給BitmapImage.Sour)。
- 爲什麼BinaryReader分配仍然在堆上 - 爲什麼所有的ExpandArray分配仍然在堆上。

在此先感謝您的見解!

void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     App.Progress.ProgressHide(); 

     if (null != e.Error) 
     { return; } 

     int index = iCenterImage; 

     if (null != e.UserState) 
      index = (int) e.UserState; 

     MemoryStream ms = new MemoryStream(350000); 
     //MemoryStream ms = new MemoryStream(); 
     BinaryReader br = new BinaryReader(e.Result); 

     int bytesRead = 0; 
     int bufferLength = 4096; 
     byte[] buffer = new byte[bufferLength]; 

     bytesRead = br.Read(buffer, 0, bufferLength); 

     while(bytesRead > 0) 
     { 
      ms.Write(buffer, 0, bytesRead); 
      bytesRead = br.Read(buffer, 0, bufferLength); 
     } 

     br.Close(); 
     br.Dispose(); 
     br = null; 

     BitmapImage b = new BitmapImage(); 
     b.SetSource(ms); 
     ms.Close(); 
     ms.Dispose(); 
     ms = null; 


     if (iCenterImage == index) 
     { 
      centerImage.Source = null; 
      centerImage.Source = b; 
     } 
     else if (iCenterImage - 1 == index) 
     { 
      leftImage.Source = null; 
      leftImage.Source = b; 

     } 
     else if (iCenterImage + 1 == index) 
     { 
      rightImage.Source = null; 
      rightImage.Source = b; 
     } 
    } 

回答

0

不要手動調用在流和讀取器上關閉()/ Dispose()。 Use using block.

對於內存分析器中的每個實例,您都可以看到callstack以瞭解誰分配了該對象。

基本上沒有在窗戶電話圖像的東西(內部圖像緩存)

嘗試已知內存泄漏與

(rightImage.Source as BitmapImage).UriSource = null; 
(rightImage.Source as BitmapImage).SetSource(null); 
替換此線

rightImage.Source = null;