标签不实时更改

时间:2018-11-03 14:14:34

标签: c# winforms

我有一个更改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);

    }
}

1 个答案:

答案 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'
    }
}