在循环中更新GUI

时间:2015-10-23 08:50:45

标签: c#

我想首先点击按钮在textbox1中打印“ms”值,然后它应该等待100ms(逐个),然后显示下一个值。

但是,在编码Thread.Sleep(100)之后,它仍然只显示按钮的最后一个值。它应该显示像秒表一样的价值。

private void button1_Click(object sender, EventArgs e)
{            
     int ms = 00;    
     for (ms = 0; ms < 10; ms++)
    {                           
        textBox1.Text = ms.ToString();                    
        Thread.Sleep(100);
        textBox1.Text = "";
    }         
}

2 个答案:

答案 0 :(得分:0)

多数民众赞成,因为你的按钮点击正在gui线程上运行,并会阻止绘画。

您可以尝试更新文本框:

private void button1_Click(object sender, EventArgs e)
{
    int ms = 00;
    for (ms = 0; ms < 10; ms++)
    {
        textBox1.Text = ms.ToString();
        textBox1.Update();
        Thread.Sleep(100);
        textBox1.Text = "";
    }

}

但是这仍然会阻止你的gui线程。如果你不想阻止当前线程,你可以创建一个新的线程来调用gui线程来改变textBox1.Text。

Writing to a TextBox from another thread?

答案 1 :(得分:0)

您的文本框仅显示最后一个值的原因是您的代码在UI线程上运行。在您的代码到达结束之前,UI没有时间更新其布局。 您可以通过使用某种背景线程机制来解决这个问题,以便UI有时间和资源来更新自己。

  • 您可以使用计时器并更新其tick事件上的文本框文本。
  • 您可以使用任务等待强制执行背景线程而不是Thread.Sleep

    private async void button1_Click(Object sender, EventArgs e)
    {
        for (int ms = 0; ms < 10; ms++)
        {
            textBox1.Text = ms.ToString();
            await Task.Delay(100);
        }
    }