2011-09-08 46 views
0

我们遇到了一些似乎与.NET运行时相关的图形问题。偶尔,我们的应用程序中所有GroupBox的边框和所有NumericUpDowns的箭头消失。看起来他们因为某种原因停止了重新绘制,因为NumericUpDowns有时会在箭头应该出现的地方出现图形垃圾。GroupBoxes和NumericUpDowns的.NET图形问题

我们怀疑多次重新启动应用程序后发生错误。一旦问题出现,重新启动应用程序将无济于事。但是关闭所有.NET进程并重新启动应用程序会使问题消失,这意味着.NET运行时会出现问题。

我们的应用程序是一个使用VS 2008 SP1开发的,面向.NET 3.5的WinForms应用程序。它以经典模式(客户端公司策略)在Windows XP SP3上运行。

我搜索了其他人有类似的问题,但大多数点击涉及GroupBoxes的自定义绘画事件。我们的控制是纯粹的标准 - 根本不使用油漆事件。

编辑:我如何故意耗尽桌面堆重现问题?我一直在玩任务管理器和GdiUsage,同时创造笔,画笔和字体像疯了似的。当然不会调用dispose,而是将它们存储在列表中以避免垃圾回收。尽管如此,在用随机颜色创建100 000笔后,根据监视工具,我只需要一些对象。

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()))); 
+0

只要您的笔名单超出范围,每笔可以垃圾收集。将列表存储在局部变量的类中。 –

+0

我的例子有点不清楚,列表实际上存储在类中。 – Anlo

回答

2

这是泄漏手柄的程序的指示标志。 Windows为机器上运行的所有程序维护一个GDI和User对象的堆。每个单独的进程都有一个10,000个句柄的配额,但是一些泄漏或繁重的程序可以使堆满容量。一旦发生这种情况,请求笔绘制边框(例如)将失败,并且东西停止绘制。这并不总是被检查,特别是在本地代码中。

您可以使用Taskmgr.exe进程选项卡来诊断它。使用视图+选择列并勾选句柄,用户对象和GDI对象。注意一个有很多这样的(数百个)程序,并在使用该程序时数量稳步增加。

当您不使用Dispose()或使用语句来处理一次性对象(如笔,画笔,字体,位图)时,您可以在.NET程序中泄漏句柄。当程序没有使用足够的内存来触发垃圾收集时,终结器可以释放句柄。

+0

谢谢你的知识丰富和详细的答案。我们在同一台机器上运行的另一个.NET应用程序中使用了大量的GDI +绘图。我们正在处理大多数图形对象,但我们可能错过了一些,将在明天进行调查...... – Anlo