我在winform应用程序中有这个代码:
for (int i = 1; i <= 20; i++)
{
lbl.Text = i.ToString();
Thread.Sleep(100);
}
我希望看到标签从1到20进展,但它只是在for循环运行时挂起,然后显示20,即我看不到1-19。
为什么会有这样的方法来快速更新标签文本,类似于模拟时钟上的毫秒数(我不是制作时钟,只是一个例子。)
由于
* 编辑:如果我有一个事件按钮增加数字而没有Thread.Sleep但是我有一个beginInvoke来播放一个wav文件*
答案 0 :(得分:4)
你正在睡觉gui线程,所以在gui再次更新睡眠之前。
尝试使用刻度为100毫秒的计时器
答案 1 :(得分:3)
在睡眠前调用Application.DoEvents();
,这将处理队列中的所有消息:
for (int i = 1; i <= 20; i++)
{
lbl.Text = i.ToString();
Application.DoEvents();
Thread.Sleep(100);
}
答案 2 :(得分:2)
应用程序挂起,你只看到20
只是因为这似乎是在UI线程上执行而你是Sleep
,因此阻塞了窗口消息循环。但是,即使不是这种情况,你很可能只会看到20
,因为循环执行得如此之快。
使用System.Threading.Timer
执行每x
毫秒,并通过在UI线程上调用适当的方法来更新标签。
以下文章演示了如何实现您可能想要的内容(虽然在WPF环境中,但原理是相同的 - 使用ISynchronizeInvoke
表示WinForms,而不是WPF中显示的Dispatcher
:
答案 3 :(得分:0)
使用定时器控件
int i=0;
private void timer_Tick(object sender, EventArgs e)
{
if(i <=20)
{
lbl.Text = i.ToString();
}
i++;
}
根据需要设置TimerInterval(间隔1000 = 1秒)