2015-02-23 123 views
1

第一行失敗,並System.OutOfMemoryException與呼叫Image.FromStreamSystem.Drawing.Image.FromStream OutOfMemory例外

using (System.Drawing.Image i = System.Drawing.Image.FromStream(new System.IO.MemoryStream(ucDocument1.UploadedFiles[0].FileBytes))) { 
//additional code here 
} 

字節陣列從DevExpress.Web.ASPxUploadControl.ASPxUploadControl對象和一個測試寫的故障的情況下字節陣列來數據庫並從數據庫中成功重新讀取證明字節數組是有效的。該操作對各種大小的PNG和JPG文件都是成功的,並且對於特定的已知非破壞性PNG/JPG文件,即使是那些尺寸小於成功情況的文件也會失敗。文件失敗反覆給出System.OutOfMemoryException例外。這怎麼解決?

+1

您是否每次都在相同的圖像上發生故障,還是更隨機?您是否嘗試過處理'OutOfMemoryException'並調用[GC.Collect](https://msdn.microsoft.com/en-us/library/xe0c2357%28v=vs.110%29.aspx),然後調用[GC。 WaitForPendingFinalizers](https://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers(v = vs.110).aspx),然後重試該操作?我發現在處理多頁TIFF文件的另一個應用程序中,有時由於內存問題而無法保存頁面,但調用GC.Collect會幫助它成功。 – pstrjds 2015-02-23 23:42:25

+0

我不認爲垃圾收集存在問題,因爲該錯誤與我的測試用例重複出現的相同文件一致。 – sammarcow 2015-02-23 23:48:23

+0

好吧,那是我問爲什麼它與相同圖像一致的一部分。如果它是隨機的,那麼我會導致一個記憶問題。您是否嘗試過只是將引起錯誤的圖像的字節數加載到測試應用程序中,而您所做的只是加載圖像? – pstrjds 2015-02-23 23:50:31

回答

0

假設你沒有泄漏任何東西,似乎有一些病理情況下,GC未能正常工作。例如,如果您使用AsParallel作爲並行查詢的一部分運行Image.FromStream,我們發現在某些機器配置中可能會耗盡內存。

是pstrjds提示對我們工作的解決方案,

try 
    { 
     return (Bitmap)Image.FromStream(stream); 
    } 
    catch (OutOfMemoryException) 
    { 
     // retry only once. If it keeps failing it may be something more serious 
     GC.Collect(); 
     GC.WaitForFullGCComplete(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     return (Bitmap)Image.FromStream(stream); 
    } 

希望有所幫助。