2012-02-20 47 views
4

我在我的C#.net win表单应用程序中遇到以下异常。如何解决winforms错误“GDI +中发生了一般性错误。”?

GDI +发生了一般性错误。
在System.Drawing.Graphics.CheckErrorStatus(的Int32状态)
在System.Drawing.Graphics.DrawRectangle(笔笔,的Int32的x,的Int32 Y,的Int32宽度,高度的Int32)
在WeifenLuo.WinFormsUI.Docking.DockWindow .OnPaint(PaintEventArgs的E)
在System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs的E,Int16的层,布尔disposeEventArgs)
在System.Windows.Forms.Control.WmPaint(消息&米)
在系统。 Windows.Forms.Control.WndProc(Message & m)
at System.Windows.Forms.ScrollableControl.WndProc(消息&米)
在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息&米)
在System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息&米)
在System.Windows.Forms的.NativeWindow.Callback(IntPtr的的HWND,味精的Int32,IntPtr的WPARAM,LPARAM的IntPtr)

最令人困惑的一点是,它很少发生,当应用程序加载表单(其中包含了一些丰富的图形,WPF工作等等),可以说大约90%的时间表单成功加载。但很少有这种情况发生,只有在某些机器上,在其他一些机器上,这种形式在100%的时间内工作,从不面临这种例外情况。

我不明白为什么会发生这种异常,因为它也没有显示导致异常的确切堆栈跟踪。请建议您是否有任何关于如何处理它的想法。

+0

错误也可能是由'g.DrawString(text,font,x,y);''x'或'y'值太大或太小造成的。 – Loathing 2015-11-28 21:32:29

回答

7

您的代码很可能泄漏GDI资源。看看Taskmgr.exe,进程选项卡。查看+选择列并勾选句柄,USER对象和GDI对象。运行你的程序并观察你的过程的显示值。 GDI对象不断攀升的价值会带来麻烦,当它达到10,000时,节目结束。

究竟是什么可能导致泄漏并不那么容易诊断。虽然您可以在调试器中单步执行代码,并留意taskmgr编号。经典的错误是在Paint事件处理程序中创建笔和画笔,而不是处理它们。没有垃圾收集器运行通常足以清理。使用使用语句来解决。

+1

很好的答案+1。我能够弄清楚究竟是什么问题。这确实是油漆工作。 – hina10531 2015-10-22 22:57:37

相关问题