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

Gor*_*ran 10 c# asp.net garbage-collection

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

我正在通过Image.FromFile读取tiff图像:

Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Ian*_*cer 19

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

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
   using (Image original = Image.FromStream(fs))
   {
      ...
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案+1.`Image.FromFile`并不总是做正确的事情.通过手动打开文件流然后从那里加载位图来替换它可以提供更多的灵活性. (2认同)

Ral*_*ine 5

或尝试:

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