2010-12-07 73 views
0

我想將一些圖片複製到RAM,但這會導致內存不足例外。 我不知道爲什麼,但我認爲這是「freeze() 」。但如何「解凍」,這真的是問題嗎?內存不足異常C#freezable.freeze

 public void preLoadThread(Object o) 
    { 
     Overlay ov = (Overlay)o; 
     ImageSource tempNext = BitmapConverter(ov.tempPreLoadPathNext); 
     ImageSource tempPrev = BitmapConverter(ov.tempPreLoadPathPrev); 
     tempNext.Freeze(); 
     tempPrev.Freeze(); 
     ov.Dispatcher.Invoke(
      DispatcherPriority.Normal, 
      (Action)delegate() 
      { 
       ov.preLoadedNext = tempNext; 
       ov.preLoadedPrev = tempPrev; 
       ov.preLoadPathNext = ov.tempPreLoadPathNext; 
       ov.preLoadPathPrev = ov.tempPreLoadPathPrev; 
      } 
     ); 
    } 

    public BitmapSource BitmapConverter(String path) 
    { 
     System.Drawing.Bitmap b = null; 
     using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) 
     { 
      try 
      { 
       b = (System.Drawing.Bitmap)System.Drawing.Bitmap.FromStream(fs); 
      } 
      catch (Exception) 
      { 
       GC.Collect(); 
       GC.WaitForFullGCComplete(); 
      } 
      fs.Close(); 
     } 

     if (b == null) 
     { 
      // Error 
      return null; 
     } 

     BitmapSizeOptions options = BitmapSizeOptions.FromEmptyOptions(); 
     BitmapSource bs = null; 
     try 
     { 
      bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       b.GetHbitmap(), 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       options); 
     } 
     catch (Exception) 
     { 
      GC.Collect(); 
      GC.WaitForFullGCComplete(); 
     } 
     return bs; 
    } 
+3

GC.Collect在catch塊中不能作爲答案。 – 2010-12-07 20:19:58

+0

我知道..這是嘗試和錯誤,因爲我不知道如何解決這個泄漏 – Martin 2010-12-07 20:25:35

回答

1

我真誠地相信記憶異常是從凍結到來( )調用,因爲這實際上沒有分配任何內存。

我敢肯定你有一個GDI泄漏......你必須在你調用CreateBitmapSourceFromHBitmap()後創建的位圖上調用DeleteObject ...但是因爲你調用GetHbitmap()作爲參數,沒有辦法刪除。

試試這個:

[System.Runtime.InteropServices.DllImport("gdi32.dll")] 
public static extern bool DeleteObject(IntPtr hObject); 

... 

IntPtr hObject = b.GetHbitmap(); 
bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
      hObject, 
      IntPtr.Zero, 
      Int32Rect.Empty, 
      options); 

DeleteObject(hObject); 


亨克是正確的,你不應該被強迫GC收集......這不是真正幫助你,因爲你沒有真正釋放任何被收集,無論如何(你唯一需要通過DeleteObject清理的東西)

我們在討論多少個1378x2000圖片?即使你修復了你的GDI泄漏,那些圖片也很大,並且會很快耗盡內存。

Curtisk是正確的,你不能解凍,你必須克隆...但是當你這樣做的時候你會分配內存。只是爲了警告你。

我認爲在64位下運行不是一種選擇...