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个计时器很便宜,如果他想要,为什么不呢?还有什么选择呢?没有你的建议当然,用户无法遵循的任何更改都是浪费。。