. net组框和数字上下起伏的图形问题
本文关键字:图形 问题 上下 数字上 数字 net | 更新日期: 2023-09-27 18:07:53
我们遇到了一些图形问题,似乎与。net运行时有关。每隔一段时间,应用程序中所有groupbox的边界和所有numericupdown的箭头都会消失。似乎他们出于某种原因停止重新绘制,因为NumericUpDowns有时在箭头应该在的地方有图像垃圾。
我们怀疑在重新启动应用程序几次后出现错误。一旦问题出现,重新启动应用程序也无济于事。但是关闭所有。net进程并重新启动应用程序会使问题消失,这表明。net运行时存在问题。
我们的应用程序是一个使用VS 2008 SP1开发的WinForms应用程序,目标是。net 3.5。它在Windows XP SP3上以经典模式运行(客户端公司政策)。
我已经搜索了其他有类似问题的人,但大多数命中都涉及groupbox的自定义绘制事件。我们的控件是纯标准的——根本没有使用油漆事件。
编辑:我怎样才能故意耗尽桌面堆来重现这个问题?我一直在玩任务管理器和GdiUsage,同时疯狂地创建笔,画笔和字体。当然不是调用dispose,而是将它们存储在一个列表中以避免垃圾回收。尽管如此,在用随机颜色创建了10万支笔之后,根据监视器工具,我只剩下了一些对象。
List<Pen> pens = new List<Pen>();
Random rnd = new Random();
for(int i = 0; i < 100000; i++)
pens.Add(new Pen(Color.FromArgb(rnd.Next())));
这是程序漏句柄的信号。Windows为运行在机器上的所有程序的GDI和User对象维护一个堆。每个进程有10,000个句柄的配额,但是一些泄漏或繁重的程序可能会使堆被填满。一旦发生这种情况,使用钢笔绘制边界(例如)的请求将失败,并且内容将停止绘制。这并不总是被检查,特别是在本机代码中。
你可以用Taskmgr.exe, Processes选项卡进行诊断。使用视图+选择列并勾选句柄,USER对象和GDI对象。当你使用一个程序时,注意它是否有很多这样的(数百),并且这个数字在稳步增长。
在。net程序中,如果不使用Dispose()或using语句处理笔、画笔、字体、位图等一次性对象,可能会泄漏句柄。当程序没有使用足够的内存来触发垃圾回收时,终结器可以释放句柄