看板 C_Sharp 關於我們 聯絡資訊
假設程式有三個控制項 from1,label1,button1 private void button1_Click(object sender, EventArgs e) { for (int i = 0; i <= 10; i++) { label1.Text = "" + i; Thread.Sleep(1000); } } 本來期望看到執行的畫面會是 label1會從1,2,3....,10 每隔一秒加一加到十 不過實際上是等待10秒後 label1.Text會直接從預設的label1變成10 也就是說程式會直到button1_Click結束後才更新label1.Text 要怎麼做label1才會出現1,2,3....,10這樣的效果呢 好像只要是控制項就會有這問題 (textBox.Text也是一樣) 這現像應該在VB6就有了 因為我在寫VBA時就遇上 不過在不使用控制項直接寫入儲存格時(如 Range("A1")=i) 可以如我預期的那樣每秒更新 請問這個怎麼解決 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.138.50.125 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1570438550.A.5DF.html
TPNEW: 要在不同的thread做 10/07 17:05
kobe8112: 控制項的文字只有UI執行緒可以變更,你應該如1樓建議, 10/07 18:13
kobe8112: for迴圈、計算新值、睡覺這幾項另開執行緒執行, 10/07 18:13
kobe8112: 僅有變更控制項文字這件事透過UI執行緒執行 10/07 18:14
annies5: 試試 Application.DoEvents(); 10/07 19:01
hijacker: 在這個例子裡只要在迴圈裡加label1.Update();就好啦 10/08 18:39
hijacker: 不過通常不會這樣寫拉 因為Thread.Sleep(1000)會卡UI 10/08 18:40
testPtt: 我只用inotifypropertychanged其他方法我不用 10/08 19:39
spfy: 五樓的方式最簡單 不用學多執行緒怎麼寫 但效能會降很多很多 10/08 20:38
Litfal: 不會用執行續就先學Timer怎麼用 10/09 01:06
mepowerlmay: 五樓讚 會跑就好 10/17 00:35
MephistoH: application.processmessage 10/22 13:43
MephistoH: 不好意思..上面那個是delphi在用的 = = 10/22 13:45
Nilife: Invoke? 10/29 06:42
baseball0209: 在迴圈內加入label1.Refresh(),強制ui優先刷新 12/13 14:55