C# 循环更新GUI

C# 循环更新GUI,c#,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中打印“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 = "";
    }         
}
private void按钮1\u单击(对象发送者,事件参数e)
{            
int-ms=00;
对于(ms=0;ms<10;ms++)
{                           
textBox1.Text=ms.ToString();
睡眠(100);
textBox1.Text=“”;
}         
}

这是因为按钮单击在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 = "";
    }

}
private void按钮1\u单击(对象发送者,事件参数e)
{
int-ms=00;
对于(ms=0;ms<10;ms++)
{
textBox1.Text=ms.ToString();
textBox1.Update();
睡眠(100);
textBox1.Text=“”;
}
}
但这仍然会阻止您的gui线程。如果不想阻止当前线程,可以创建一个新线程来调用gui线程来更改textBox1.Text


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

  • 您可以使用计时器并更新文本框中的文本
  • 您可以使用任务等待来强制执行后台线程,而不是线程。睡眠

    private async void button1_Click(Object sender, EventArgs e)
    {
        for (int ms = 0; ms < 10; ms++)
        {
            textBox1.Text = ms.ToString();
            await Task.Delay(100);
        }
    }
    
    private async void按钮1\u单击(对象发送方,事件参数e)
    {
    用于(int-ms=0;ms<10;ms++)
    {
    textBox1.Text=ms.ToString();
    等待任务。延迟(100);
    }
    }
    

尝试搜索;使用计时器。