【发布时间】:2012-02-08 11:42:15
【问题描述】:
假设我创建了一个位图
Bitmap bitmap = new Bitmap(320, 200);
当我将它写入某个流时(在我的例子中,它是一个 HttpResponseStream,由 HttpListenerResponse 给出),一切都很好:
bitmap.Save(stream, ImageFormat.Png);
我不需要bitmap.Dispose(),位图使用的资源会被自动清理。然而,直接将 Png 写入不可搜索的流的问题在于,它可能会导致 A generic error occurred in GDI+,当我在 Azure 上尝试我的 Asp 应用程序时发生了这种情况。这就是我的代码现在的样子:
using (MemoryStream ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Png);
ms.WriteTo(stream);
}
现在除非我在 bitmap.Dispose() 之后,这会泄漏。
改写问题以获得更具体的答案: 为什么 Bitmap 内存泄漏似乎取决于我将其保存到哪种类型的流?
更新: 正如我在 cmets 中被问到的那样,我是否确定这是泄漏。在压力测试中反复调用上述方法,我的 w3wp 进程将使用 gigs 和 gigs 的内存,直到我的机器开始交换并且它不会清理。
【问题讨论】:
-
你确定这是内存泄漏,而不仅仅是垃圾收集还没有清理它吗?
-
你确定你有内存泄漏吗?他们通过 .Net 的发明重新定义了内存泄漏的定义;)
-
@James;使用 GDI+ 可能会出现系统内存泄漏,一旦 AppDomain 被释放就会被清除。
标签: c# .net bitmap memorystream