如何解决 winforms 错误“GDI+ 中发生一般错误。”?
Posted
技术标签:
【中文标题】如何解决 winforms 错误“GDI+ 中发生一般错误。”?【英文标题】:How to resolve the winforms error "A generic error occurred in GDI+. "? 【发布时间】:2012-02-20 13:47:28 【问题描述】:我在我的 C#.net win 表单应用程序中遇到以下异常。
GDI+ 中出现一般错误。 在 System.Drawing.Graphics.CheckErrorStatus(Int32 状态) 在 System.Drawing.Graphics.DrawRectangle(Pen pen, Int32 x, Int32 y, Int32 width, Int32 height) 在 WeifenLuo.WinFormsUI.Docking.DockWindow.OnPaint(PaintEventArgs e) 在 System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,Int16 层,布尔 disposeEventArgs) 在 System.Windows.Forms.Control.WmPaint(消息&m) 在 System.Windows.Forms.Control.WndProc(Message&m) 在 System.Windows.Forms.ScrollableControl.WndProc(Message&m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
最令人困惑的一点是,当应用程序加载表单(其中包含一些丰富的图形、WPF 工作等)时,它很少发生,可以说大约 90% 的时间表单加载成功。但它很少会被复制,而且只在某些机器上,在其他一些机器上,这种形式是 100% 的工作,并且永远不会遇到这个异常。
我不知道为什么会发生这种异常,因为它也没有显示导致异常的确切堆栈跟踪。如果有人知道如何处理它,请提出建议。
【问题讨论】:
该错误也可能是由g.DrawString(text, font, x, y);
引起的,其中x
或y
的值太大或太小。
【参考方案1】:
您的代码可能严重泄漏了 GDI 资源。查看 Taskmgr.exe,进程选项卡。查看 + 选择列并勾选句柄、用户对象和 GDI 对象。运行您的程序并观察您的过程显示的值。 GDI 对象的不断攀升的值会带来麻烦,当它达到 10,000 时,节目就结束了。
究竟是什么可能导致泄漏并不是那么容易诊断。尽管您可以在调试器中单步执行您的代码并密切关注 taskmgr 编号。典型的错误是在 Paint 事件处理程序中创建钢笔和画笔而不是处置它们。没有垃圾收集器经常运行以进行清理。使用using语句修复。
【讨论】:
很好的答案 +1。我能够弄清楚到底是什么问题。这确实是油漆工作。以上是关于如何解决 winforms 错误“GDI+ 中发生一般错误。”?的主要内容,如果未能解决你的问题,请参考以下文章
c#中利用system.timers多线程做图像处理,图像保存时提示“GDI+ 中发生一般性错误”,如何解决?