在Paint事件处理程序中处理图形元素

时间:2014-09-13 16:01:50

标签: c# winforms gdi+ dispose

我正在使用C#,。net 3.5和Visual Studio 2008.

在阅读了一些关于何时必须处理元素之后,我有点困惑。下面的Paint事件处理程序是否正常,或者它是否是内存泄漏?

private void ProgressBar_Paint(object sender, PaintEventArgs e) {
        Graphics graphics = e.Graphics;
        string rightText = "rightext";
        string leftText = "lefttext";;
        string textToDraw = rightText + leftText;
        graphics.DrawString(textToDraw, progressBar.Font, 
             new SolidBrush(progressBar.ForeColor), 10, 30);                         
    }

这样可以吗?

private void ProgressBar_Paint(object sender, PaintEventArgs e) {
        Graphics graphics = e.Graphics;
        string rightText = "rightext";
        string leftText = "lefttext";;
        string textToDraw = rightText + leftText;
        using (SolidBrush solidBrush = new SolidBrush(progressBar.ForeColor)) {
            graphics.DrawString(textToDraw, progressBar.Font, solidBrush, 18, 20);
        }
    }

2 个答案:

答案 0 :(得分:6)

你的第一个片段有一个简单明了的bug。你真的应该丢掉那把刷子。如果你不这样做,那么你完全依靠终结器来处理它。完成工作有点慢,它只能在垃圾收集完成后才能运行。

特别是进度条样式控制的问题,它倾向于以高速率绘制自身。比正常的控件要多得多,因为如果你编写好的代码就会有很多进步。如果垃圾收集器无法跟上并清理那些刷子,那么您的程序将崩溃。当几乎有一万个刷子需要最终确定时,操作系统会阻止你的程序创建更多的刷子,kaboom。

答案 1 :(得分:2)

第二种方法可以防止笔刷上的内存泄漏。应该处理从IDisposable派生的每个在退出方法后不重用的对象。 (请注意,如果您将其丢弃然后尝试访问它,则很可能处于无法使用的故障状态,并且您很可能会遇到异常。)

配置对象的首选方法是使用using语句。

相关问题