BufferedGraphicsContext Errore
-
09-06-2019 - |
Domanda
Ricevo il seguente errore e stack di chiamate al tempo stesso tutti i giorni dopo diverse ore di utilizzo dell'applicazione.Qualcuno può far luce su ciò che sta accadendo?
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)
Soluzione
Vi è una lunga MSDN forum di discussione di questo errore qui.Nella maggior parte dei casi l'errore è apparentemente associato con:
- Un sottostante di OutOfMemory problema, che si manifesta come il BufferedGraphicsContext eccezione, forse a causa di un quadro di bug.
- Una perdita di oggetti GDI (creazione di oggetti GDI e non disponendo di loro).
Mi ricordo di avere visto questo errore me un anno fa, ed è sicuramente associato con un problema di memoria che hanno reso la nostra app riempire tutti disponibili VM dopo un lungo periodo, in modo #1, concorda con quello che ho osservato.
Altri suggerimenti
So che questa domanda è vecchia, ma ho avuto lo stesso problema e ho scoperto, che non solo ha mostrato, quando ho usato più controlli che hanno implementato il manuale doppio buffer.
Per me, ho trovato il problema, a questo punto:
BufferedGraphicsContext _BackbufferContext = BufferedGraphicsManager.Current;
Così tutti i miei controlli utilizzato il Corrente contesto, che presumo sia sempre la stessa.Dopo che ho sostituito dall'
BufferedGraphicsContext _BackbufferContext = new BufferedGraphicsContext();
tutto funziona come volevo.
Spero che questo sia un po ' utile.
uno sparo nel buio - e-pittura da più thread?Se si sta facendo la pittura relativi lavori, di farlo sul thread della GUI o sincronizzare il tuo codice con attenzione.