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

tra*_*ler 1 c# gdi+ dispose winforms

我正在使用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);                         
    }
Run Code Online (Sandbox Code Playgroud)

这会好吗?

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 6

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

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