Winform有Red Xexception

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

在此处输入图像描述

在谷歌搜索后我发现这种错误发生在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); } } 

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

我认为应该这样做

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

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

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

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

BackGroundWorker类