System.Drawing对象非托管资源处理

时间:2012-12-25 09:38:51

标签: c# c#-4.0 dispose unmanaged system.drawing

我有以下代码:

using System.Drawing;
...
Graphics _graphics = Graphics.FromImage(...)
...
public void Draw(Stream stream, Rectangle rect, Color color) {
    _graphics.FillRectangle(new SolidBrush(Color), 0, 0, Width, Height);
    _graphics.DrawImage(new Bitmap(stream), rect);
}

我是否应该使用new Bitmap(...)使用drawImage? 同问new SolidBrush(...)

2 个答案:

答案 0 :(得分:4)

是的,您应该将它们包含在using语句中。此外,您应确保在此类中使用的_graphics实例上调用Dispose方法。这可以通过使包含类实现IDisposable来完成,以便此类的使用者可以将其包装在using语句中。

答案 1 :(得分:2)

是的,处置这些资源非常重要。特别是位图很麻烦,它消耗大量的非托管内存来存储像素数据,但托管的Bitmap类包装器非常小。你可以在触发垃圾收集之前创建一个 lot 的Bitmap对象,给出Bitmap构造函数开始失败的高概率,因为没有剩余的非托管内存。

所以重写如下:

public void Draw(Stream stream, Rectangle rect, Color color) {
    using (var bmp = new Bitmap(stream))
    using (var brush = new SolidBrush(Color)) {
        _graphics.FillRectangle(brush, 0, 0, Width, Height);
        _graphics.DrawImage(bmp, rect);
    }
}