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