循环更新GUI

本文关键字:GUI 更新 循环 | 更新日期: 2023-09-27 18:18:59

我想先点击按钮在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 = "";
    }         
}

循环更新GUI

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

  • 你可以使用计时器并在它的tick事件上更新文本框的文本。
  • 你可以使用task await来强制执行后台线程而不是Thread。睡眠

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

那是因为你的按钮点击正在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.

从另一个线程写入文本框?