1

我正在使用第 3 方控件 (ComponentOne),并且间歇性地我会得到这个典型的红色 X 框,例如这个典型的图像所示。起初我以为我有 GDI 泄漏,所以在做了一些腿部工作后,我在绘制控件时验证了我的 GDI 编号是正常的。

在此处输入图像描述

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

所以我的下一步是在我的代码中进行以下覆盖。

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

我认为这应该可以解决问题,但我不能一直重现这个问题,所以我还不能完全测试上面的代码。我的问题是,如果我呈现我的控件并且它有异常,那么这段代码将尝试重绘控件。这会陷入无限循环并冻结我的用户界面吗?还是您认为导致异常的任何原因都会消失,并且在第二次重绘控件时它应该呈现正常?

4

2 回答 2

5

我认为这应该可以解决问题

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

在 OnPaint() 中获得异常并不是您真正可以生存的东西。用户无需查看任何内容,这是有保证的支持电话。与其隐藏问题,不如使用异常来找出实际出了什么问题并解决问题。使用 Debug + Exceptions,勾选 CLR 异常的 Thrown 复选框,以便调试器在引发异常时停止。以防万一,在框架代码中引发异常的可能性不大,也可以使用工具+选项,调试并取消选中“仅启用我的代码”选项。

于 2013-07-29T15:33:47.647 回答
0

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

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

BackGroundWorker 类

于 2013-07-29T14:55:22.483 回答