0

我有一个使用DotNetBar 3rd 方 UI 库的大型资源密集型 C# GUI 应用程序。

有时,它会因以下异常和调用堆栈而失败:

====================================
 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属性,而属性 getter 没有参数,因此很难知道“参数无效”可能意味着什么。

这个异常偶尔发生,它不是 100% 的可重现的,但似乎与我的应用程序中的高资源使用率相关(它发生在将特定的大型“项目”加载到应用程序中时),而其他较小的项目不会触发这个,即使大型和小型项目都以相同的方式使用 DotNetBar UI。

什么会导致SmoothingMode属性抛出 ArgumentException?

4

1 回答 1

0

解决了这个问题,结果证明拥有该对象的System.Drawing.Graphics对象已被处置。

在 DotNetBar 库中,DotNetBar.BufferedBitmap对象正在执行一些低级调用以分配位图,然后使用Graphics.FromHdc(IntPtr). 如果BufferedBitmap在使用之前释放了 ,那么Graphics当您尝试访问对象上的所有属性时,它们都会引发异常。

位图在使用前被处理的原因很复杂,是我的应用程序与 DotNetBar 交互的结果。简而言之:一条WM_NCACTIVATE消息触发了一些代码来重绘窗口标题,但是这个标题绘制代码在我的应用程序中触发了一个 OnPaint,并间接触发了正在处理另一个的 WndProc,WM_NCACTIVATE从而调用了它自身下面的标题绘制代码。一级标题绘制代码正在处理另一级未完成使用的位图。

于 2018-10-02T22:41:38.867 回答