Как устранить ошибку winforms «В GDI + произошла общая ошибка»? - PullRequest
4 голосов
/ 20 февраля 2012

Я сталкиваюсь со следующим исключением в моем приложении C # .net win форм.

В 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 (Сообщение & m)
в System.Windows.Forms.Control.WndProc (сообщение & 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% времени и никогда не сталкивается с этим исключением.

Я не понимаю, почему происходит это исключение, потому что оно также не показывает точную трассировку стека, которая вызывает исключение. Пожалуйста, предложите, если есть какие-либо идеи о том, как с этим бороться.

1 Ответ

9 голосов
/ 20 февраля 2012

Ваш код, вероятно, плохо пропускает ресурсы GDI.Взгляните на Taskmgr.exe, вкладка Процессы.View + Select Columns и отметьте маркеры, объекты USER и объекты GDI.Запустите вашу программу и наблюдайте за отображаемыми значениями для вашего процесса.Постоянно растущее значение для объектов GDI означает проблему, шоу заканчивается, когда оно достигает 10 000.

Точно то, что может вызвать утечку, не так легко диагностировать.Хотя вы можете пошагово выполнить код в отладчике и следить за номером taskmgr.Классическая ошибка - создание ручек и кистей в обработчике событий Paint, а не их удаление.Без сборщика мусора работает достаточно часто, чтобы убирать.Для исправления используйте оператор , используя оператор .

...