2010-05-28 115 views
1

我試着去調用一些windows窗體代碼(比如設置label.visible = true在一些事件代碼,一切編譯好的,但形式不應對變化!這可能是什麼問題呢?C#Windows窗體不更新的方法

問題是線:

labelNewCall.Visible = true; 
timerNewCall.Enabled = true; 

代碼:http://pastebin.com/gV28PN4P

還有其他的代碼沒有工作,直到我重新排序,它的一些(順序並不重要,但它沒有工作,否則......)

+2

這段代碼是從另一個線程調用的嗎? – ChrisF 2010-05-28 11:47:55

回答

1

您也可以嘗試一個方便的小方法,你可以在你的內環地方:

Application.DoEvents(); 

這裏的MSDN寫了起來:

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx

+0

如果您不調用Application.DoEvents(),如何執行某些文件IO操作? – Oscar 2010-05-28 12:23:17

+2

不要使用的DoEvents – 2010-05-28 16:13:41

+3

感謝MOD-下來沒有解釋爲什麼*不*要做到這一點。 – 2010-06-01 08:20:14

1

你是否在另一個UI線程中調用此方法?如果是這樣,你應該使用Invoke和/或BeginInvoke方法。

看文章What's up with BeginInvoke?

+0

有單獨的線程在收到數據時拋出事件,但事件代碼位於Winforms線程中創建的類中。我知道你不能簡單地從沒有創建窗體的線程中調用Windows窗體代碼,但是這個代碼並沒有警告或者有關它的任何事情,所以我假設它在同一個線程上運行......很遺憾,我有我的IDE的Express版本所以我不能看到它實際上從哪個線程運行...此外 - 一些winforms代碼作品,一些不請......爲什麼沒有一致的行爲? = O和它不僅windows窗體代碼 - 行90(文件IO)也不會執行... – Oscar 2010-05-28 12:02:10

+0

哪裏是代碼writen並不重要。重要的是當前的線程和線程在哪裏創建了winforms控件/窗體。 的WinForms控件主要是圍繞與Windows消息的工作本地Windows控件封裝。 winforms控件隱藏了複雜性(例如Text屬性將WM_GETTEXT,WM_SETTEXT消息發送到應用程序消息隊列),但是需求是使用UI線程中的這些屬性/方法。 – TcKs 2010-05-28 15:25:49

1

這可能是因爲soundCapture_BufferThrown回調函數不是GUI線程上運行。閱讀this post以獲取有關WinForms中線程化的更多詳細信息。