我正在處理一個嚴重的數據綁定的Win.Forms應用程序,我發現了一些奇怪的行爲。該應用程序具有單獨的I/O線程,通過異步web請求接收更新,然後將其發送到主/ GUI線程,以處理和更新應用程序範圍的數據存儲(這又可以將數據綁定到各種GUI-元素等)。 Web請求另一端的服務器需要定期請求或會話超時。與從非GUI線程顯示MessageBox相關的問題
我已經通過處理線程的問題等幾個嘗試的解決方案走了,我觀察到以下行爲:
如果我使用Control.Invoke從我發送更新/ O-線程到主線程,此更新會導致MessageBox顯示主窗體的消息泵停止,直到用戶單擊確定按鈕。這也阻止了I/O線程繼續最終導致服務器超時。
如果我使用Control.BeginInvoke從I/O線程(或多個)發送更新主線程的主窗體的消息泵不不停止,但如果更新的處理導致了一個消息是如圖所示,該更新的其餘部分的處理將暫停,直到用戶單擊確定。由於I/O線程繼續運行,並且消息泵繼續處理消息,因此可以在消息框完成之前調用幾個用於更新的BeginInvoke。這導致無法接受的失序更新。
I/O線程將更新添加到阻塞隊列(非常類似於Creating a blocking Queue<T> in .NET?)。 GUI線程使用Forms.Timer定期應用阻塞隊列中的所有更新。該解決方案既解決了阻塞I/O線程的問題,又解決了更新的順序性問題,即直到完成前一個更新纔會開始。但是,性能成本很低,並且在顯示更新時引入延遲,這在長期內是不可接受的。我希望主線程中的更新處理是事件驅動的而不是輪詢。
所以對我的問題。我應該怎麼做這:
- 避免阻塞I/O線程
- 保證更新完成了序列
- 保持主消息泵運行,同時顯示一個消息框,爲的結果更新。
更新:請參見下面
問題:必須在用戶單擊messageBox上的「確定」後才更新GUI,或者只能通知他們已發生更新,例如通過多行文本框中的消息? – Asher 2010-04-08 10:19:56
它必須是一個彈出窗口,但我不確定它是否需要模態。我可以創建自己的非模態彈出窗口。 – 2010-04-08 11:14:41