首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PaintEvent内存泄漏

PaintEvent内存泄漏
EN

Stack Overflow用户
提问于 2012-12-29 11:15:34
回答 2查看 819关注 0票数 2

我目前正在使用窗体上的paint事件将图像绘制到屏幕上。(想想背景图像)和一些矩形在这个图像的顶部。

代码语言:javascript
复制
 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,然后停止绘制到窗体,并在失败的绘制的图片上显示带红色十字的白色背景。

我对它为什么跑得这么糟糕感到有点不知所措。我刚开始使用paint事件绘图,所以任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-02 13:25:08

ImageIDisposable,因此您应该在"using“块中执行DrawImage调用,以确保释放图像。

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-02 13:02:56

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14078399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档