[问题] 跑循环时怎么即时更新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