PaintEvent内存泄漏

时间:2012-12-29 03:15:34

标签: c# winforms memory paint memory-leaks

我目前正在使用表单上的paint事件将图像绘制到屏幕上。 (想想背景图片)和这张图片上方的一些矩形。

 private void MainWindow_Paint(object sender, PaintEventArgs e)
 {
    e.Graphics.Clear(Color.CornflowerBlue);
    e.Graphics.DrawImage(Image.FromFile(m_Directory + @"\Images\" + BackgroundText), m_Screen);
    e.Graphics.FillRectangle(BGBrush, new Rectangle(X, Y, Width, Height));
    e.Graphics.DrawString(Text, Settings.TextFont, Other.Settings.TextBrush, new Rectangle(X, Y + 2, Width, Height));
 }

页面正在经常重新绘制(几乎在每次鼠标移动事件中)并且导致使用大量内存。在停止绘制到表单之前达到1,500,000k并在图片上显示带有红叉的白色背景,以显示失败的颜料。

我对它如何如此糟糕地失控感到轻微的损失。我是绘画活动的新手,所以任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:1)

ImageIDisposable,因此您应该在“使用”块中执行DrawImage调用,以确保处置Image。

但最重要的是,我会重新考虑在Paint事件中执行大量IO操作。可能提前加载图像,让Paint事件只担心绘图。您目前正在加载相同的图像数百次。

答案 1 :(得分:0)

我认为如果您的UI线程不断使用,终结器将被阻止。对象可能是垃圾收集的,但可处置的对象将被添加到终结器队列中。终结器在UI线程中运行,因此如果您的UI线程忙,则不会调用dispose。图形对象通常包装一个非托管对象,该对象需要使用dispose()进行清理。

完成绘画后,我会手动处理所有与图形相关的对象。