当前位置: 首页 > 编程语言 > C#

System.ComponentModel.Win32Exception-Theoperationcompletedsuccessfully分享

时间:2023-04-10 14:12:02 C#

System.ComponentModel.Win32Exception:Theoperationcompletedsuccessfully我在运行WindowsForms应用程序时有时会遇到这个异常:System.ComponentModel.Win32Exception:TheoperationcompletedsuccessfullyatSystem.Drawing.BufferedGraphicsContext.CreateCompatibleDIB(IntPtrhdc,IntPtrhpal,Int32ulWidth,Int32ulHeight,IntPtr&ppvBits)在System.Drawing.BufferedGraphicsContext.CreateBuffer(IntPtrwsrc,Int32offsetX,Int32height2offset,Int32height3offset)System.ight3offsetDrawing.BufferedGraphicsContext.AllocBuffer(图形targetGraphics,IntPtrtargetDC,RectangletargetRectangle)在System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(图形targetGraphics,IntPtrtargetDC,RectangletargetRectangle)在System.Drawing.BufferedGraphicsContext.Allocate(IntPtrtangletargetRDC,Rectangle).Windows.Forms.Control.WmPaint(Message&m)在System.Windows.Forms.Control.WndProc(Message&m)在System.Windows。System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)在System.Windows.Forms.NativeWindow中的Forms.DataGridView.WndProc(Message&m)。Callback(IntPtrhWnd,Int32msg,IntPtrwparam,IntPtrlparam)可能是什么原因?总而言之,我基于.Net的DataGridView编写的自定义网格使用自定义代码绘制单元格行在我的网格中可以跨越多个可视页面。(这是一个业务需求)问题是.Net为启用DoubleBuffering的控件预先分配了一个内存缓冲区。对于DataGridViews网格,缓冲区需要相当大才能容纳网格中可能存在的大行。在极端情况下,线条最多可以跨越32000像素(由于.net的限制)。项目中的网格宽度通常在500到800像素之间。所以生成的缓冲区可以是(32bpp*800*32000=~100MB)简而言之,系统无法创建兼容的图形对象,因为它有时无法预留足够大的缓冲区来容纳所需的数据。为了解决这个问题,我不得不引入一系列优化:Windows对每个进程有10000个句柄的硬性限制。相当无用的异常“操作成功完成”可能表明已达到此限制。如果由于代码中的资源泄漏而发生这种情况,那么您很幸运,因为您至少有机会修复代码。遗憾的是,您对WinForms内部创建的句柄几乎无能为力。例如,TreeView控件大量创建字体句柄,使其难以在需要在UI中表示非常大的树的情况下使用。一些有用的链接:http://support.microsoft.com/kb/327699http://nomagichere.blogspot.com/2008/03/systemcomponentmodelwin32exception-is.html我曾经在创建一个巨大的PictureBox时遇到过类似的异常。似乎我无法分配足够大的图表。实际上我正在做的是为一个简单的游戏绘制某种地图,我有一个放大功能,基本上可以创建一个更大的缓冲区,然后我以更大的比例重新绘制所有图形。长时间使用此缩放功能或达到足够深的级别会导致此异常。也许您正在创建大量图形而不是处理它们,或者只是一个大到无法分配的图形。我在VB.NET中遇到了同样的问题。原因很奇怪:在奥地利,我们的Windows系统通常有一个逗号和一个.作为成千上万的分裂分子。如果这是扭曲的,Windows将抛出此错误(我认为这是美国的标准)。更改它应该可以解决奥地利的所有问题……祝您好运!发现这可能有帮助-似乎是图形或控制处理问题,它在极端情况下是由于不处理图像而引起的。你应该在加载位图时使用IDisposable来克服这个问题;using(Bitmapb=Bitmap.FromFile("myfile.jpg")){//Dowhatever}也可能与内存碎片有关。我们在outapp中也使用了非托管组件,当非托管组件吃掉所有大的连续块时,可能会出现无法为双缓冲图形分配足够大的缓冲区的问题。此外,内存泄漏会导致抛出异常。例如,由于其中一个InternetExplorer中的错误,具有2-3个Web浏览器的应用程序可能会在几分钟内达到超过1GB。以上是C#学习教程:System.ComponentModel.Win32Exception:Theoperationhassuccessfullycompletedallthecontentshared.如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: