[問題] 跑迴圈時怎麼即時更新label.text

看板C_Sharp (C#)作者 (笑吟吟的淫淫笑)時間5年前 (2019/10/07 16:55), 編輯推噓5(5010)
留言15則, 11人參與, 5年前最新討論串1/1
假設程式有三個控制項 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

10/07 17:05, 5年前 , 1F
要在不同的thread做
10/07 17:05, 1F

10/07 18:13, 5年前 , 2F
控制項的文字只有UI執行緒可以變更,你應該如1樓建議,
10/07 18:13, 2F

10/07 18:13, 5年前 , 3F
for迴圈、計算新值、睡覺這幾項另開執行緒執行,
10/07 18:13, 3F

10/07 18:14, 5年前 , 4F
僅有變更控制項文字這件事透過UI執行緒執行
10/07 18:14, 4F

10/07 19:01, 5年前 , 5F
試試 Application.DoEvents();
10/07 19:01, 5F

10/08 18:39, 5年前 , 6F
在這個例子裡只要在迴圈裡加label1.Update();就好啦
10/08 18:39, 6F

10/08 18:40, 5年前 , 7F
不過通常不會這樣寫拉 因為Thread.Sleep(1000)會卡UI
10/08 18:40, 7F

10/08 19:39, 5年前 , 8F
我只用inotifypropertychanged其他方法我不用
10/08 19:39, 8F

10/08 20:38, 5年前 , 9F
五樓的方式最簡單 不用學多執行緒怎麼寫 但效能會降很多很多
10/08 20:38, 9F

10/09 01:06, 5年前 , 10F
不會用執行續就先學Timer怎麼用
10/09 01:06, 10F

10/17 00:35, 5年前 , 11F
五樓讚 會跑就好
10/17 00:35, 11F

10/22 13:43, 5年前 , 12F
application.processmessage
10/22 13:43, 12F

10/22 13:45, 5年前 , 13F
不好意思..上面那個是delphi在用的 = =
10/22 13:45, 13F

10/29 06:42, 5年前 , 14F
Invoke?
10/29 06:42, 14F

12/13 14:55, 5年前 , 15F
在迴圈內加入label1.Refresh(),強制ui優先刷新
12/13 14:55, 15F
文章代碼(AID): #1TclsMNV (C_Sharp)
文章代碼(AID): #1TclsMNV (C_Sharp)