正确处理未引用的Image而不进行垃圾回收C#

时间:2014-02-14 02:23:25

标签: c# image bitmap garbage-collection

我有一个C#程序,它从目录中的图像创建一个位图列表。它将使用整个位图列表生成一个新图像,然后保存。当用户加载新目录以重复该过程时,将清除并重新填充位图列表。在创建对象“新位图(路径)”时加载位图。

我遇到了用户执行以下步骤时出现的问题:

  1. 从目录1加载图片
  2. 选择不保存,而是从目录2
  3. 加载图像
  4. 尝试通过覆盖目录1中的图像来保存
  5. 由于“GDI +中的一般错误”,程序无法保存,因为它仍在“使用”正在覆盖的图像。
  6. 从目录1加载的原始位图列表确实已清除,然后重新填充目录2中的图像。但是,Bitmap.Save()拒绝覆盖之前加载的图像,除非我调用执行Clear()后,System.GC.Collect()。

    我很确定问题与保持Bitmaps有关,即使没有引用,否则为什么垃圾收集会解决问题呢?这是解决这个问题的正确方法,还是有一种“适当”的方式在C#中处理Bitmaps?感谢。

1 个答案:

答案 0 :(得分:1)

您需要在Dispose个实例上调用Bitmap ..以便他们释放文件句柄。

var bitmap = new Bitmap(path_to_file);
// use it
bitmap.Dispose();

或者,由于Bitmap继承自实现Image的{​​{1}},您可以这样做:

IDisposable