Pregunta

Recibo el siguiente error y la pila de llamadas al mismo tiempo todos los días después de varias horas de uso de la aplicación.¿Alguien puede arrojar algo de luz sobre lo que está pasando?

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)
¿Fue útil?

Solución

Hay una discusión muy larga en los foros de MSDN sobre este error. aquí.En la mayoría de los casos, el error aparentemente está asociado con:

  1. Un problema subyacente de OutOfMemory, que se manifiesta como la excepción BufferedGraphicsContext, posiblemente debido a un error del marco.
  2. Una fuga de objetos GDI (creación de objetos GDI y no eliminación de ellos).

Recuerdo haber visto este error hace aproximadamente un año, y definitivamente estaba asociado con un problema de memoria que hizo que nuestra aplicación llenara todas las VM disponibles después de una ejecución prolongada, por lo que el n.° 1 está de acuerdo con lo que he observado.

Otros consejos

Sé que esta pregunta es antigua, pero tuve el mismo problema y descubrí que solo apareció cuando usé múltiples controles que implementaban doble almacenamiento en búfer manual.

Para mí, encontré el problema en este punto:

BufferedGraphicsContext _BackbufferContext = BufferedGraphicsManager.Current;

Entonces todos mis controles usaron el Actual contexto, que supongo que es siempre el mismo.Después de que lo reemplacé por

BufferedGraphicsContext _BackbufferContext = new BufferedGraphicsContext();

Todo funciona como quería.

Espero que esto sea un poco útil.

Un disparo en la oscuridad: ¿estás pintando a partir de varios hilos?Si está realizando un trabajo relacionado con la pintura, hágalo en el hilo de la GUI o sincronice su código con cuidado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top