使用Image.FromFile不会释放文件句柄

时间:2009-10-30 11:35:32

标签: c# asp.net garbage-collection

我正在将多个多图像tiff文件连接到单个多图像tiff文件,并且在删除源tiff文件时遇到问题,因为Image类继续保持它们的句柄。

我正在通过Image.FromFile阅读tiff图片:

Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile);

之后我以相同的方式读取所有其他tiff图像并将它们附加到生成的tiff图像。

当我完成后,我使用此代码来发布引用并保存生成的文件:

ep.Param[0] = new EncoderParameter(enc, (long) EncoderValue.Flush);
resultTiff.SaveAdd(ep);
resultTiff.Dispose();

现在问题是文件上的句柄仍然存在(因此无法删除文件),除非我在GC.Collect()调用后调用resultTiff.Dispose()

您可以想象通过调用GC我感觉不舒服,那么还有其他方法可以实现吗?

3 个答案:

答案 0 :(得分:17)

使用Image.FromFile解决问题的最佳方法是使文件句柄处于打开状态,而不是使用Image.FromStream

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
   using (Image original = Image.FromStream(fs))
   {
      ...

使用显式Dispose(),using()语句或将值设置为null在垃圾收集发生之前不能解决问题。强制垃圾收集发生通常是一个坏主意。

答案 1 :(得分:5)

或尝试:

Using(Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile))
{
   ep.Param[0] = new EncoderParameter(enc, (long) EncoderValue.Flush);
   resultTiff.SaveAdd(ep);
}

答案 2 :(得分:1)

您可以尝试:

resultTiff = null;