2010-01-12 50 views
6

我有一个GUI应用程序,它连接到传感器,收集数据并使用BackgroundWorker线程在后台处理它。如何调试和解决'DisconnectedContext'崩溃?

现在,我使用ProgressChanged将数据发布到GUI,这似乎很适合开始使用。自从我提高了数据速率并发现了一个问题,如果软件运行几分钟,处理器使用量似乎会逐渐增加,直到在我的计算机上的两个内核上达到接近100%,然后出现如下错误:

托管调试助手'DisconnectedContext'在'myapp.exe'中检测到问题。其他信息:上下文0xe2ba0已断开连接。从当前上下文释放接口(上下文0xe2d10)。这可能会导致损坏或数据丢失。

我读过一些网络上的东西,这表明如果GUI应用程序无法足够快地抽取消息,就会发生这种情况。我注意到,如果我迅速调整窗口的大小(即抽取更多的消息来支持我所认为的理论),我可以激起同样的崩溃发生得更快。

所以这里的问题是:

  1. 是否有人与我有关消息抽的假设一致?
  2. 是否有其他解释?
  3. 有什么方法可以证明它(查看队列中的消息数量)?
  4. 这些都是不好的代码味道,这表明我正在做这个错误的方式吗?

任何意见将非常感激地收到。

回答

3

这种听起来像一个非常具体的问题,我认为这就是为什么没有人回答,但我想我可以帮助问题#3。

Spy++应该能够看到消息去你的窗口。我认为你可以用它来观看消息泵到你的GUI并做你的调整大小测试。如果你看到试图处理的消息大量增加,它可能会证实你的假设。

顺便说一句,我读过你可能能够将主线程公寓从STAThread改为MTAThread,以使这个MDA消失。

Perphaps您可以修改您的应用程序,将传感器读数吐出到文件中,或将其排队到不同的机制中,而不是不断更新GUI。 HTH。

+1

我尝试了MTATHread设置,它似乎只是偶尔会导致崩溃。我已经采用了queuenig机制,并且在显示代码的一部分中发现了一个错误,该代码过度填充了“RichTextBoxControl”。在这两者之间,看起来我已经解决了这个问题。感谢您的建议。 – 2010-02-09 13:09:16

+0

我已经看到这种情况再次发生了几次,它肯定是通过尝试从数据生产者线程向其侦听器发送太多'ProgressChanged'请求触发的。 – 2010-02-17 15:10:23