Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新标签时,程序挂起For循环_C#_.net_Winforms_For Loop_Freeze - Fatal编程技术网

C# 更新标签时,程序挂起For循环

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,这仅仅是因为这看

我在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
,这仅仅是因为这看起来是在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)