foreach循环中垃圾收集器太慢了?

时间:2017-07-25 11:15:46

标签: c# foreach garbage-collection

我有一个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秒钟。应该是我想的垃圾收集器的足够时间。

3 个答案:

答案 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
    }
}