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)
你的第一个片段有一个简单明了的bug.你真的应该丢掉那把刷子.如果你不这样做,那么你完全依靠终结器来处理它.完成工作有点慢,它只能在垃圾收集完成后运行.
特别是进度条样式控制的问题,它倾向于以高速率绘制自身.比正常的控件要多得多,因为如果你编写好的代码就会有很多进步.如果垃圾收集器无法跟上并清理那些刷子,那么您的程序将崩溃.当几乎有一万个刷子需要最终确定时,操作系统会阻止你的程序创建更多的刷子,kaboom.