2017-07-25 52 views
2

我有一個foreach循環,我用圖像做一些操作。運行此代碼時,我得到一個OutOfMemoryException 50+圖像;因爲圖像實例每個都是15 + MB。垃圾收集器在foreach循環中太慢?

var files = Directory.GetFiles(path).ToList(); 

foreach (var file in files) 
{ 
    Image image = new Bitmap(file); 

    //Do some operations 
} 

我刪除了主邏輯,因爲這個小問題仍然存在。當我在foreach循環中添加GC.Collect();時,問題消失了,我沒有發現異常。

我的問題是:垃圾收集器是否太慢,無法清除不再需要的圖像,而無需調用Collect方法或我缺少其他東西?

以前從未發現過這個問題。我從來沒有想過會有問題,因爲//Do some operations部分需要約1秒的每個圖像。我認爲應該有足夠的時間用於垃圾收集器。

+0

以及你沒有真正有一個選擇,如果你得到OutOfMemoryExceptions。另外你的意思是太慢? –

+0

@PaulF不是重複的。 OP在問別的東西 –

+0

@YvetteColomb:據我所見,它是重複的 - 使用Bitmaps時,OP會遇到內存不足的問題 - 這是因爲GC不會自動處理非託管內存。給出的解決方案回答了問題。另請參閱下面Romano的回答。 – PaulF

回答

7

也許你應該using工作:

var files = Directory.GetFiles(path).ToList(); 

foreach (var file in files) 
{ 
    using (Image image = new Bitmap(file)) 
    { 
     // do work 
    } 
} 

這樣的Bitmap將迭代

+0

謝謝,忘了'Bitmap'並處理它;) –

2

後丟棄你試過明確處置的實例?

var files = Directory.GetFiles(path).ToList(); 
foreach (var file in files) 
{ 
    Image image = new Bitmap(file); 

    //Do some operations 
    image.Dispose(); 
    //image = null; 
} 

同樣可以用using塊更好地實現。

1

問題不在於GC,而在於使用位圖。雖然GC最終將它們撿起來,你需要用影像創作using塊,以確保他們及時處置:

foreach (var file in files) 
{ 
    using (Image image = new Bitmap(file)) { 
     //Do some operations 
    } 
}