Вопрос

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

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 очень долго обсуждается эта ошибка. здесь.В большинстве случаев ошибка, по-видимому, связана либо с:

  1. Основная проблема OutOfMemory, которая проявляется как исключение BufferedGraphicsContext, возможно, из-за ошибки платформы.
  2. Утечка объектов GDI (создание объектов GDI, а не их удаление).

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

Другие советы

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

Для себя я нашел проблему в этом месте:

BufferedGraphicsContext _BackbufferContext = BufferedGraphicsManager.Current;

Поэтому все мои элементы управления использовали Текущий контекст, который, как я полагаю, всегда один и тот же.После того, как я заменил его на

BufferedGraphicsContext _BackbufferContext = new BufferedGraphicsContext();

все работает как хотелось.

Я надеюсь, что это немного полезно.

выстрел в темноте - ты рисуешь из нескольких потоков?Если вы выполняете работу, связанную с рисованием, делайте это в потоке графического интерфейса или тщательно синхронизируйте свой код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top