Application.DoEvent浅析及实时刷新控件状态
我们再写一个实时更改控件状态的循环时会经常发现控件没有实时的刷新,而是直接显示了最后的控件状态,例如:
我在一个button的Click事件中写入下面这行代码,想要实时的去更改textbox的值,但是真正的效果是一次就到了9999
for (int i = 0; i < 10000; i++)
{
textBox1.Text = i.ToString();
}
百思不得只好骑姐啊,到网上查了些资料,勉强弄懂了些:
当运行 Windows 窗体时,它将创建新窗体,然后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的所有代码。所有其他事件在队列中等待。当代码处理事件时,应用程序不会响应。例如,如果将甲窗口拖到乙窗口之上,则乙窗口不会重新绘制。
也就是说我会先把我这个button里的事件先处理完,才去处理控件重绘的事件。如果不信你可以逐语句的运行下看看,在button事件没有运行完之前,textBox里的值是空的,当你button的Click事件运行完毕之后textbox才会有值显示。
解决的办法有很多:
Application.DoEvents();
DoEvents in your co
DoEvents from your co
因为每次调用他都会导致当前线程暂停,若果是大数据量的循环的话,这个方法是比较耗时的,所以我更喜欢用下面的方法:
Control.Update();Control.Refresh();
Control.Update 方法:使控件重绘其工作区内的无效区域。
Control.Refresh 方法:强制控件使其工作区无效并立即重绘自己和任何子控件;
至于这两个方法有什么区别,我推荐大家看另一个人的博客:
http://blog.youkuaiyun.com/minghe2009/article/details/6577066