C# 更新标签时,程序挂起For循环
我在winform应用程序中有以下代码:C# 更新标签时,程序挂起For循环,c#,.net,winforms,for-loop,freeze,C#,.net,Winforms,For Loop,Freeze,我在winform应用程序中有以下代码: for (int i = 1; i <= 20; i++) { lbl.Text = i.ToString(); Thread.Sleep(100); } for(inti=1;i您正在休眠gui线程,因此在gui再次更新其休眠线程之前 尝试使用计时时间为100ms的计时器,您正在休眠gui线程,因此在gui再次更新其休眠线程之前 尝试使用计时时间为100ms的计时器,应用程序会挂起,而你只会看到20,这仅仅是因为这看
for (int i = 1; i <= 20; i++)
{
lbl.Text = i.ToString();
Thread.Sleep(100);
}
for(inti=1;i您正在休眠gui线程,因此在gui再次更新其休眠线程之前
尝试使用计时时间为100ms的计时器,您正在休眠gui线程,因此在gui再次更新其休眠线程之前
尝试使用计时时间为100ms的计时器,应用程序会挂起,而你只会看到20
,这仅仅是因为这看起来是在UI线程上执行的,而你正在睡眠
,因此会阻塞窗口消息循环。然而,即使不是这样,你也很可能只会看到20
循环将执行得如此之快
使用System.Threading.Timer
每隔x
毫秒执行一次,并通过调用UI线程上的适当方法更新标签
下面的文章演示了如何实现您可能需要的功能(虽然是在WPF环境中,但原理是相同的-对WinForms使用ISynchronizeInvoke
,而不是WPF中显示的调度程序
):
应用程序挂起,您只会看到20
,原因很简单,这似乎是在UI线程上执行的,而您正在睡眠
,因此会阻塞窗口消息循环。然而,即使不是这样,您也很可能只会看到20
,因为循环执行得如此之快
使用System.Threading.Timer
每隔x
毫秒执行一次,并通过调用UI线程上的适当方法更新标签
下面的文章演示了如何实现您可能需要的功能(虽然是在WPF环境中,但原理是相同的-对WinForms使用ISynchronizeInvoke
,而不是WPF中显示的调度程序
):
在睡眠前调用Application.DoEvents();
将处理队列中的所有消息:
for (int i = 1; i <= 20; i++)
{
lbl.Text = i.ToString();
Application.DoEvents();
Thread.Sleep(100);
}
for(int i=1;i在睡眠前调用Application.DoEvents();
将处理队列中的所有消息:
for (int i = 1; i <= 20; i++)
{
lbl.Text = i.ToString();
Application.DoEvents();
Thread.Sleep(100);
}
for(inti=1;i使用定时器控制
int i=0;
private void timer_Tick(object sender, EventArgs e)
{
if(i <=20)
{
lbl.Text = i.ToString();
}
i++;
}
inti=0;
私有无效计时器(对象发送方、事件参数)
{
如果(i使用定时器控制
int i=0;
private void timer_Tick(object sender, EventArgs e)
{
if(i <=20)
{
lbl.Text = i.ToString();
}
i++;
}
inti=0;
私有无效计时器(对象发送方、事件参数)
{
如果(i)