Winform有Red X异常

时间:2013-07-29 14:49:10

标签: c# .net winforms

我正在使用第三方控件(ComponentOne),并且我会间歇性地获得这个典型的红色X盒,例如这个典型的图像显示。起初我以为我有一个GDI泄漏,所以在做了一些腿部工作后,我确认我的GDI数字在绘制控件时很好。

enter image description here

在谷歌搜索后,我发现OnPaint()事件发生了这种错误,因此即使我在调用Render的控件时尝试并捕获它,它也不会捕获它。

所以我的下一步是在我的代码中使用以下覆盖。

        protected override void OnPaint(PaintEventArgs e)
       {
           try
           {
               base.OnPaint(e);
           }
           catch (Exception ex)
           {
               this.Invalidate();  //attempt to redraw the control
               XmSam.Log(ex);
           }
       }

我认为应该这样做但我不能一直重现这个问题,所以我还没能完全测试上面的代码。我的问题是,如果我渲染我的控件并且它有异常,那么这段代码将尝试重绘控件。这会陷入无限循环并冻结我的UI吗?或者你会认为导致异常的任何事情都会消失,并且在第二次控制重绘时它会变得很好吗?

2 个答案:

答案 0 :(得分:5)

  

我认为应该做的伎俩

不,你做得更糟。现在你的OnPaint()方法一遍又一遍地运行,可能会反复出现在同一个异常上。您会看到您的程序也在燃烧100%核心。

在OnPaint()中获取异常并不是你真正能够存活的东西。没有什么值得关注的用户,这是一个有保障的支持电话。而不是隐藏问题,使用异常来找出实际出错的地方并修复问题。使用Debug + Exceptions,勾选CLR异常的Thrown复选框,以便在引发异常时调试器将停止。为了以防万一,在框架代码中引发异常并不是不太可能,也可以使用工具+选项,调试并取消选中“启用我的代码”选项。

答案 1 :(得分:0)

当我在过去看到这个时,它总是与线程问题有关。您是否从与UI线程不同的线程更新此控件?

我已经处理了一段时间,但我认为最简单的方法是使用BackGroundWorker类来执行后台操作并更新表单控件。

BackGroundWorker Class