这可能与阻塞的 UI 线程中的 ProgressBar 更新有关,但略有不同。
在对崩溃的 WinForms 控件(DevExpress 树列表)进行故障排除时,我们团队的一名成员遇到了不寻常的情况,我想知道是否有人可以帮助我们了解发生了什么。英语不是他的母语,所以我代表他发帖。
请参阅Visual Studio 2005 的此屏幕截图。
请注意以下几点:
主 UI 线程已停止,当前处于 DevExpress 控件绘制方法中。
屏幕上显示的代码来自同一调用堆栈中较早的点。此代码位于数据层中,并被调用以响应控件请求为树节点显示图像的请求。(也许也源自 Paint 处理程序)
显示的代码来自调用堆栈的早期,在主 UI 线程上,当前正在等待锁定!由于远程系统可以发送在数据模型中的后台线程上处理的事件(即,数据模型在客户端和服务器之间同步),我们锁定以保持数据收集线程安全。
正如调用堆栈所示,我们继续在 UI 线程上处理绘制消息,而我们希望线程被阻塞。
这很难复制,我无法在我自己的盒子上使用更简单的测试项目来复制。然而,当这种情况出现时,结果是 DevExpress 控件的内部状态可能会混乱,导致控件崩溃。这看起来不像是控件中的错误,因为毫无疑问,它是在假设这些绘制方法仅在 UI 线程上运行的情况下编写的。我们在此处看到的内容使 UI 线程看起来像两个线程。
看起来这可能只是调用堆栈表示中的一个 Visual Studio 错误,除了这整个努力是为了解决已发布应用程序中控件偶尔崩溃的问题(在这种情况下,它显示为一个大UI 中的红色 X),因此问题似乎并非孤立于调试环境。
好吧,这很复杂,但希望是有道理的。有任何想法吗?