我有一个foreach循环,我用图像做一些操作。当运行50个图像的代码时,我得到了OutOfMemoryException
;因为图像实例各15 MB。
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 :(得分:7)
也许您应该使用using
:
var files = Directory.GetFiles(path).ToList();
foreach (var file in files)
{
using (Image image = new Bitmap(file))
{
// do work
}
}
这样,Bitmap
将在迭代后处理
答案 1 :(得分: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
块可以更好地实现相同功能。
答案 2 :(得分:1)
问题不在于GC,而在于您使用位图。虽然GC最终会将它们捡起来,但您需要在using
块中包装图像以确保及时处理:
foreach (var file in files)
{
using (Image image = new Bitmap(file)) {
//Do some operations
}
}