加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么我没有内存泄漏.Dispose()我将.Save()的位图映射到M

发布时间:2020-12-16 01:50:31 所属栏目:百科 来源:网络整理
导读:假设我创建了一个位图 Bitmap bitmap = new Bitmap(320,200); 当我把它写到某个流(在我的情况下,它是一个HttpResponseStream,由HttpListenerResponse给出),一切都很好: bitmap.Save(stream,ImageFormat.Png); 我不需要bitmap.Dispose(),位图使用的资源将自
假设我创建了一个位图

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内存的泄漏似乎取决于我将它保存到哪种类型的流?

更新:
正如我在评论中被问及我是否确定这是泄密一样.在压力测试中反复调用上面的内容,我的w3wp进程将进入gig和gig的内存使用,直到我的机器开始交换,它将无法清理.

解决方法

Bitmap类使用非托管资源.这些资源与内存流类使用的资源无关.您可以将位图类包装在using语句中,以便在完成后处理位图实例.

错过了你问题的后半部分. “设置并忘记它”的一种方法是创建一个包装类,它暴露位图实例,但实现了一个处理位图实例的析构函数.这个析构函数意味着位图类在垃圾收集中被隐式处理.

最后要注意:您实例化实现IDisposable的任何对象必须由您的代码处理. Dipose永远不会被暗中调用.即使在你的第一个例子.仅仅因为您将数据保存到流中并不意味着内存已被释放.大多数情况下,在实例化它的同一代码段中对一个对象进行dipos是个好主意.这有助于通过提高代码透明度来更轻松地阅读代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读