我有一个占用资源的大型C#GUI应用程序,它使用DotNetBar第三方UI库。
有时,它会失败,并出现以下异常并调用堆栈:
====================================
ERROR
====================================
Exception type: ArgumentException
Parameter is not valid.
====================================
CALL STACK
====================================
at System.Drawing.Graphics.get_SmoothingMode()
at DevComponents.DotNetBar.⍜.PaintCaptionBackground(FormCaptionRendererEventArgs e)
at DevComponents.DotNetBar.Rendering.Office2007Renderer.DrawFormCaptionBackground(FormCaptionRendererEventArgs e)
at DevComponents.DotNetBar.OfficeForm.ὀ(Graphics ٠)
at DevComponents.DotNetBar.OfficeForm.ᲀ()
at DevComponents.DotNetBar.OfficeForm.WindowsMessageNCActivate(Message& m)
at DevComponents.DotNetBar.RibbonForm.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
在堆栈顶部失败的调用只是访问SmoothingMode属性,而属性获取器没有参数,因此很难知道“参数无效”的含义。
此异常是偶发性的,并非100%的时间都是可重现的,但似乎与我的应用程序中的高资源使用率有关(它发生在将特定的大型“项目”加载到应用程序中时),而其他较小的项目却确实如此即使大型和小型项目都以相同的方式使用DotNetBar UI,也不会触发此操作。
什么会导致SmoothingMode
属性引发ArgumentException?
答案 0 :(得分:0)
解决了这个问题,原来是处置拥有System.Drawing.Graphics
对象的对象的情况。
在DotNetBar库中,DotNetBar.BufferedBitmap
个对象正在执行一些低级调用以分配位图,然后使用Graphics.FromHdc(IntPtr)
返回图形。如果BufferedBitmap
在使用前已被处置,则Graphics
对象上的所有属性在您尝试访问它们时都会引发异常。
位图在使用前被处置的原因很复杂,这是我的应用程序与DotNetBar交互的结果。简而言之:一条WM_NCACTIVATE
消息触发了一些代码来重绘窗口标题,但是此标题绘制代码正在触发我的应用程序中的OnPaint,并间接触发了正在处理另一个WM_NCACTIVATE
的WndProc,并且因此在其下方调用字幕绘制代码。一级字幕绘制代码正在处理另一级尚未使用的位图。