在使用应用程序几个小时后,我每天都会同时收到以下错误和调用堆栈。谁能解释一下正在发生的事情吗?

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();

一切都按预期进行。

我希望这有点帮助。

黑暗中的一枪——你是用多线程绘画吗?如果您正在做与绘画相关的工作,请在 GUI 线程上进行或仔细同步您的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top