我有一个更改label8
的循环。我希望我的label8
实时更改,但我只能得到最后的值。我怎么做?我需要并行线程吗?
这是更改标签的代码:
private void Form1_Shown(object sender, EventArgs e)
{
decimal C = 35;
label8.Text = ":";
while (true)
{
C -= Convert.ToDecimal(0.01);
label8.Text = Convert.ToString(C);
System.Threading.Thread.Sleep(200);
}
}
答案 0 :(得分:1)
这是因为WinForm UI是通过使用mssage循环实现的,该循环可更新控制器并在名为“ UI Thread” 的特殊线程上运行。
MessageLoop负责调用您注册到的所有事件回调。 Stephan Toub关于这个主题Await, and UI, and deadlocks! Oh my!
的精彩文章在您的情况下,事件消息循环名为Form1_Shown
,并使用UI线程运行它。在运行过程中,您命令将当前线程(UI线程并负责更新)进入睡眠状态。然后继续进行,直到循环结束为止。
您实际上从未释放过UI线程来完成除您自己之外的其他工作。 (其中一些作品正在收到您要更新的Label.Text的通知)
大多数情况下,让线程进入睡眠状态是一个糟糕的设计或缺乏理解。
您可能想延迟一下,这实际上会将线程释放给其他活动,但是您不知道该怎么做,因此改为将其休眠。
您可能想要类似的东西
private async void Form1_Shown(object sender, EventArgs e) // Notice the 'async'
{
decimal C = 35;
label8.Text = ":";
while (true)
{
C -= Convert.ToDecimal(0.01);
label8.Text = Convert.ToString(C);
await Task.Delay(200); // Notice the 'await'
}
}