如何解决 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); 引起的,其中xy 的值太大或太小。 【参考方案1】:

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

究竟是什么可能导致泄漏并不是那么容易诊断。尽管您可以在调试器中单步执行您的代码并密切关注 taskmgr 编号。典型的错误是在 Paint 事件处理程序中创建钢笔和画笔而不是处置它们。没有垃圾收集器经常运行以进行清理。使用using语句修复。

【讨论】:

很好的答案 +1。我能够弄清楚到底是什么问题。这确实是油漆工作。

以上是关于如何解决 winforms 错误“GDI+ 中发生一般错误。”?的主要内容,如果未能解决你的问题,请参考以下文章

c#中利用system.timers多线程做图像处理,图像保存时提示“GDI+ 中发生一般性错误”,如何解决?

GDI+中发生一般性错误的解决办法

GDI+中发生一般性错误(asp.net(C#))

GDI+ 中发生一般性错误。 究竟是啥问题不是一般性的图片上传出错。

GDI+中发生一般性错误

用vs2010编写C#程序,将图片保存到一个文件夹中,下次循环覆盖保存,提示gdi+中发生一般性错误。。。