Ошибка буферизованного графического контекста
-
09-06-2019 - |
Вопрос
Я получаю следующую ошибку и стек вызовов одновременно каждый день после нескольких часов использования приложения.Может ли кто-нибудь пролить свет на происходящее?
System.InvalidOperationException: BufferedGraphicsContext cannot be disposed of because a buffer operation is currently in progress.
at System.Drawing.BufferedGraphicsContext.Dispose(Boolean disposing)
at System.Drawing.BufferedGraphicsContext.Dispose()
at System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)
at System.Drawing.BufferedGraphicsContext.Allocate(IntPtr targetDC, Rectangle targetRectangle)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ToolStrip.WndProc(Message& m)
at System.Windows.Forms.MenuStrip.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Решение
На форумах MSDN очень долго обсуждается эта ошибка. здесь.В большинстве случаев ошибка, по-видимому, связана либо с:
- Основная проблема OutOfMemory, которая проявляется как исключение BufferedGraphicsContext, возможно, из-за ошибки платформы.
- Утечка объектов GDI (создание объектов GDI, а не их удаление).
Я помню, как сам видел эту ошибку год назад или около того, и она определенно была связана с проблемой памяти, из-за которой наше приложение заполнило всю доступную виртуальную машину после длительного запуска, поэтому № 1 согласен с тем, что я наблюдал.
Другие советы
Я знаю, что этот вопрос старый, но у меня была та же проблема, и я обнаружил, что она появилась только тогда, когда я использовал несколько элементов управления, которые реализовали двойную буферизацию вручную.
Для себя я нашел проблему в этом месте:
BufferedGraphicsContext _BackbufferContext = BufferedGraphicsManager.Current;
Поэтому все мои элементы управления использовали Текущий контекст, который, как я полагаю, всегда один и тот же.После того, как я заменил его на
BufferedGraphicsContext _BackbufferContext = new BufferedGraphicsContext();
все работает как хотелось.
Я надеюсь, что это немного полезно.
выстрел в темноте - ты рисуешь из нескольких потоков?Если вы выполняете работу, связанную с рисованием, делайте это в потоке графического интерфейса или тщательно синхронизируйте свой код.