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

作者: unfinish (百年孤寂)   2019-10-07 16:55:48
假設程式有三個控制項
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)
可以如我預期的那樣每秒更新
請問這個怎麼解決
謝謝大家
作者: TPNEW (Peisky)   2019-10-07 17:05:00
要在不同的thread做
作者: kobe8112 (小B)   2019-10-07 18:13:00
控制項的文字只有UI執行緒可以變更,你應該如1樓建議,for迴圈、計算新值、睡覺這幾項另開執行緒執行,僅有變更控制項文字這件事透過UI執行緒執行
作者: annies5 (念渝)   2019-10-07 19:01:00
試試 Application.DoEvents();
作者: hijacker (懶人一枚)   2019-10-08 18:39:00
在這個例子裡只要在迴圈裡加label1.Update();就好啦不過通常不會這樣寫拉 因為Thread.Sleep(1000)會卡UI
作者: testPtt (測試)   2019-10-08 19:39:00
我只用inotifypropertychanged其他方法我不用
作者: spfy (spfy)   2019-10-08 20:38:00
五樓的方式最簡單 不用學多執行緒怎麼寫 但效能會降很多很多
作者: Litfal (Litfal)   2019-10-09 01:06:00
不會用執行續就先學Timer怎麼用
作者: mepowerlmay (用心,找對人)   2019-10-17 00:35:00
五樓讚 會跑就好
作者: MephistoH (默非斯托)   2019-10-22 13:43:00
application.processmessage不好意思..上面那個是delphi在用的 = =
作者: Nilife (Al-Qaeda)   2019-10-29 06:42:00
Invoke?
作者: baseball0209   2019-12-13 14:55:00
在迴圈內加入label1.Refresh(),強制ui優先刷新

Links booklink

Contact Us: admin [ a t ] ucptt.com