BufferedGraphicsContext 错误
-
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();
一切都按预期进行。
我希望这有点帮助。
黑暗中的一枪——你是用多线程绘画吗?如果您正在做与绘画相关的工作,请在 GUI 线程上进行或仔细同步您的代码。
不隶属于 StackOverflow