Application.DoEvent和定时刷新控件

我们写一个textbox,让其依循环递增,但每次都会出现假死现象,等循环结束后,变为最终值。今天总结一下:

private void button3_Click(object sender, EventArgs e)
{

      for (int i = 0; i < 10000; i++) 

     {
           textBox1.Text = i.ToString();
     }

}

Windows 窗体应用程序运行时,它将创建一个新的窗体,然后该窗体等待需要处理的事件。该窗体在每次处理某个事件(如按钮单击)时,都会处理与该事件关联的所有代码。所有其他事件在队列中等待。在代码处理事件时,应用程序并不响应。例如,当将另一窗口拖到该窗口前面时,该窗口不重新绘制。针对这种情况有一下2终解决办法、

1.Application.DoEvent();

 for (int i = 0; i < 10000; i++) 

     {
           textBox1.Text = i.ToString();

           Application.DoEvent();
     }

2.this.Refresh();

       Application.DoEvents()处理当前在消息队列中的所有Windows 消息。 
       Refresh(); 强制控件使其工作区无效并立即重绘自己和任何子控件 

         其实DoEvents跟多线程有些类似,却是完全不同的。使用DoEvents可以让事件(循环)在没有完成的时候就可以处理其他事件(当然多线程也可以实现)而这一切却不是同步的,当前事件(循环)不会等待完成自己而再去处理下一个事件,而是在DoEvents时就暂停(注意只是暂停,没有消失,而直接执行下一个得到的指令(事件)。而且当这个下一个指令完成后,先前在DoEvents处暂停的代码会再次继续执行。

     所以使用DoEvents就要特别注意了,千万不要以为他只是简简单单强制执行到此处的代码。如果不知道它的工作方式,使用它可能给程序带来意想不到的麻烦。

原文地址:https://www.cnblogs.com/nanyangzp/p/3157451.html