Invoke and BeginInvoke
在 Invoke 或者 BeginInvoke 的使用中无一例外地使用了委托 Delegate ,至于委托的本质请参考我的另一随笔: 对 .net 事件的看法 。 一、为什么 Control 类提供了 Invoke 和 BeginInvoke 机制? 关于这个问题的最主要的原因已经是 dotnet 程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。 1 、 windows 程序消息机制 Windows GUI 程序是基于消息机制的,有个主线程维护着一个消息泵。这个消息泵让 windows 程序生生不息。 Windows GUI 程序的消息循环 Windows 程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源。这里的 while 循环使用了 GetMessage ()这个方法,这是个阻塞方法,也就是队列为空时方法就会被阻塞,从而这个 while 循环停止运动,这避免了一个程序把 cpu 无缘无故地耗尽,让其它程序难以得到响应。当然在某些需要 cpu 最大限度运动的程序里面就可以使用另外的方法,例如某些 3d 游戏或者及时战略游戏中,一般会使用 PeekMessage ()这个方法,它不会被 windows 阻塞,从而保证整个游戏的流畅和比较高的帧速。 这个主线程维护着整个窗体以及上面的子控件。当它得到一个消息,就会调用