我在ASP.NET应用程序中使用.NET中的GDI +进行了大量的图像处理.
我经常发现Image.FromFile()保持文件句柄打开.
为什么是这样?在没有保留文件句柄的情况下打开图像的最佳方法是什么.
假设我创建了一个位图
Bitmap bitmap = new Bitmap(320, 200);
Run Code Online (Sandbox Code Playgroud)
当我把它写到某个流(在我的情况下,它是一个HttpResponseStream,由HttpListenerResponse给出),一切都很好:
bitmap.Save(stream, ImageFormat.Png);
Run Code Online (Sandbox Code Playgroud)
我不需要bitmap.Dispose(),位图使用的资源将自动清理.直接将Png写入不可搜索的流的问题是,它可能导致GDI +中发生一般错误,当我在Azure上尝试我的Asp应用程序时发生这种情况.这就是我的代码现在的样子:
using (MemoryStream ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Png);
ms.WriteTo(stream);
}
Run Code Online (Sandbox Code Playgroud)
现在除非我之后使用bitmap.Dispose(),否则会泄漏.
重新提出问题以获得更具体的答案: 为什么这种位图内存的泄漏似乎取决于我将其保存到哪种类型的流?
更新: 正如我在评论中被问到我是否确定它是泄密.在压力测试中反复调用上面的内容,我的w3wp进程将进入gig和gig的内存使用,直到我的机器开始交换,它将无法清理.