循环更新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 = "";
}
}
您的文本框只显示最后一个值的原因是因为您的代码在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.
从另一个线程写入文本框?