2010-01-12 134 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