C# 标签上没有';不能实时改变
我有一个循环,可以更改C# 标签上没有';不能实时改变,c#,winforms,C#,Winforms,我有一个循环,可以更改label8。我想让我的标签8实时更改,但我只得到最后一个值。我该怎么做?我需要并行线程吗 这是更改标签的代码: private void Form1_Shown(object sender, EventArgs e) { decimal C = 35; label8.Text = ":"; while (true) { C -= Convert.ToDecimal(0.01); label8.Text =
label8
。我想让我的标签8
实时更改,但我只得到最后一个值。我该怎么做?我需要并行线程吗
这是更改标签的代码:
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);
}
}
这是因为WinForm UI是通过使用mssage循环实现的,mssage循环更新控制器并在名为“UI线程”的特殊线程上运行 MessageLoop负责调用您注册到的所有事件回调。有一篇关于这个话题的优秀文章 在您的例子中,显示了名为
Form1\u的事件消息循环
,并使用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'
}
}
使用
Thread.Sleep
时,用户界面线程处于休眠状态,因此永远看不到任何更新。使用BackgroundWorker、System.Windows.Forms.Timer甚至TaskForget threading等,除非您确实有工作负载用户界面的更改最好通过刷新控件来实现。@t每200毫秒刷新一次听起来像是对CPU时间的巨大浪费不,事实并非如此。每秒刷新标签5个计时器很便宜,如果他想要,为什么不呢?还有什么选择呢?没有你的建议当然,用户无法遵循的任何更改都是浪费。。