0

我想进行速度测试,以了解 Graphics.FromImage() 的成本。

为此,我首先做了一个循环,在其中反复调用 Graphics.FromImage。现在在我的第二次测试中,我只做了一次,但现在我得到了一个错误。

    m_Buffer = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
    m_g = Graphics.FromImage(m_Buffer)

    For i As Integer = 0 To 1000
        Using m_g
            m_g.FillEllipse(New SolidBrush(Color.Blue), 0, 0, 100, 100)
        End Using
    Next i

在 (i=1) 上,我在 m_g.FilleEllipse 行上收到错误“参数无效”有人知道为什么吗?

4

2 回答 2

1

我认为这将是因为它Graphics.FromImage是一个静态调用,并且包装了 using 语句尝试调用 dispose,这意味着下一轮它不能使用。

于 2012-10-31T09:52:16.567 回答
1

也许你应该这样做

....
Using m_g
    For i As Integer = 0 To 1000
        Using blue As New SolidBrush(Color.Blue)
            m_g.FillEllipse(blue, 0, 0, 100, 100)
        End Using
    Next i
End Using
....

对 Graphics 对象的引用应在循环之后处理,对 SolidBrush 的引用应在循环内处理。

编辑:

使用非常重要。特别是当您处理图形句柄或数据库连接等系统资源时。Using 是 try/finally 子句的替代品,它会在 End Using 处自动处理您声明的对象。这保证了即使在异常情况下,您的系统资源也将被正确处理,而无需等待垃圾收集器通过。
在 1000 个 SolidBrush 对象(和底层系统图形句柄)之上的循环中,将立即被调用,而不会对系统图形内存造成压力。

于 2012-10-31T10:02:48.447 回答