我有一个 GUI 应用程序,它连接到传感器、收集数据并使用 BackgroundWorker
线程在后台处理数据。
就目前情况而言,我正在使用 ProgressChanged
将数据发布到 GUI,这似乎一开始就运行良好。此后我提高了数据速率并发现了一个问题;如果软件运行几分钟,处理器使用量似乎会增加,直到我机器上的两个内核都达到接近 100%,此时,我收到一条错误,内容如下:
Managed Debugging Assistant 'DisconnectedContext' has detected a problem in 'myapp.exe'. Additional Information: Context 0xe2ba0 is disconnected. Releasing the interfaces from the current context (context 0xe2d10). This may cause corruption or data loss.
我在网上读到了一些内容,这些内容表明,如果 GUI 应用程序无法足够快地发送消息,则可能会发生这种情况。我注意到如果我快速调整窗口大小(即泵入更多消息),我可以更快地引发相同的崩溃,这支持我认为的理论吗?
所以这里的问题是:
- 是否有人同意我关于消息泵的假设?
- 还有其他解释吗?
- 有什么方法可以证明这一点(也许可以查看队列中的消息数量)?
- 这些不良代码味道是否表明我的处理方式是错误的?
如有任何建议,我们将不胜感激。
最佳答案
这听起来像是一个非常具体的问题,我认为这就是为什么还没有人回答的原因,但我认为我可以帮助解决问题 #3。
Spy++应该能够看到发送到您窗口的消息。我认为您可以使用它来观察消息泵送到您的 GUI 并进行调整大小测试。如果您看到尝试处理的消息大量增加,则可能会证实您的假设。
顺便说一句,我读到您也许可以将主线程单元从 STAThread 更改为 MTAThread,以使此 MDA 消失。
也许您可以修改您的应用程序,将传感器读数输出到文件中或以不同的机制将它们排队,而不是不断更新 GUI。 HTH。
关于debugging - 如何调试并解决 'DisconnectedContext'崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2048731/