2013-03-06 81 views
1

在任何.NET 2.0 Winforms應用程序中,如果您在調試模式下運行代碼,並且您要麼打中斷點,要麼逐步進入代碼,並且想要查看被調試的應用程序的GUI,然後.NET不繪製應用程序屏幕。GUI在調試模式下不會重新繪製

例如,我有一個應用程序將一些消息寫入窗體上的TextBox。當我一步一步地調試代碼或者命中斷點時,我想查看TextBox中所有消息的記錄,但是如果按Alt-Tab從VS2005窗口切換到WinForms應用程序窗口,我所看到的是白色的。直到您在VS2005中的調試模式下按F5,表單纔會重新繪製。

這是什麼原因,並有沒有辦法克服這一點,而不會在代碼中引入任何線程?

+0

當你進入你的進程時,所有線程都被掛起,所以沒有消息被泵送。你最好使用'Debug.WriteLine'來寫入調試輸出,並觀察那裏出現的內容而不必中斷。 – vcsjones 2013-03-06 18:25:46

+1

當然,UI線程被調試器凍結了。窗口不會更新,直到您恢復運行。稍後,當UI線程再次空閒並獲取繪製請求時。這是設計。 – 2013-03-06 18:27:16

+0

@vcsjones:是的,但不是在沒有通過消息泵的任何事情(比如調用OnPaint())時,在調試器中同步發生任何事情嗎? – 2013-03-06 18:29:07

回答

0

原因是因爲您只能有一個UI線程,並且當您輸入更新該代碼的方法時,代碼將開始阻塞UI線程。在你的方法退出之前它不會更新。

Here is a good SO on message pumps,這是驅動的UI更新

你應該能夠使用Add Watch/Quick Watch看任何價值在調試時間。無論如何,這聽起來像你真正想要的東西。

2

什麼是當你調試,你有效地阻止了UI線程此

的原因 - 你手動通過其執行流程步進。 UI線程在停止執行時無法繪製UI。

,是有辦法克服這個

你可以嘗試手動打電話Application.DoEvents(),但我一般會建議反對。

只需等到方法結束並讓UI正常重繪即可。如果你的方法很長(在時間上),那麼請記住,當不是調試時,UI在執行該方法時仍然無法自行更新。這可能會導致你改變你的設計(很難僅從我們目前掌握的信息中知道)。

+0

如果任何線程被掛起,如何調用Application.DoEvents()?你是指從直接窗口? – vcsjones 2013-03-06 18:28:41

0

與其他人在回答和評論中所說的一樣,UI線程被阻塞,因此無法重繪。但是,如果你只想要做的是看到的GUI,而不是與它進行交互,並且你正在運行Windows 7/8(這聽起來不太可能,因爲你使用的是VS2005)並沒有禁用航空偷看,您可以將鼠標懸停在任務欄上的應用程序中,Windows將顯示預覽縮略圖。將鼠標懸停在縮略圖上時,即使斷點阻塞了UI線程,也可以在應用程序中「偷看」。

相關問題