PaintEvent内存泄漏

本文关键字:泄漏 内存 PaintEvent | 更新日期: 2023-09-27 17:49:59

我目前正在窗体上使用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));
 }

页面经常被重新绘制(几乎在每次鼠标移动事件中),并且导致使用大量内存。到达150万k时,它就会停止向表单绘制,并在绘制失败的图片上显示带有红色十字的白色背景。

我有点不明白为什么事情进展得这么糟糕。我是新的绘画与油漆事件,所以任何帮助将非常感激!

PaintEvent内存泄漏

ImageIDisposable,所以你应该在"using"块中执行DrawImage调用,以确保图像被处理。

但最重要的是,我会重新考虑在Paint事件中执行繁重的IO操作。可能有图像加载提前,有油漆事件只担心绘制。

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

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