Invoke 和 BeginInvoke 的区别

Invoke 和 BeginInvoke 的区别

在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate。 

Invoke

Invoke方法用于同步地从非UI线程调用UI线程上的方法。当从非UI线程调用Invoke时,当前线程会被阻塞,直到UI线程完成被调用方法的执行。这保证了UI的更新是在UI线程中进行的,但同时也可能造成调用线程的等待,影响程序响应性。

BeginInvoke

Invoke不同,BeginInvoke方法用于异步地从非UI线程调用UI线程上的方法。使用BeginInvoke时,调用线程不会被阻塞,可以继续执行后续代码,而UI更新则在后台排队,等待UI线程处理。这提高了程序的并发性和响应速度,但需要注意处理UI更新完成后的回调逻辑。

一、为什么Control类提供了Invoke和BeginInvoke机制?

关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。

1、windows程序消息机制

Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵。这个消息泵让windows程序生生不息。

Invoke 和 BeginInvoke 的区别_第1张图片

                                                  Windows GUI程序的消息循环

Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源。这里的while循环使用了GetMessage()这个方法,这是个阻塞方法,也就是队列为空时方法就会被阻塞,从而这个while循环停止运动,这避免了一个程序把cpu无缘无故地耗尽,让其它程序难以得到响应。当然在某些需要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些3d游戏或者及时战略游戏中,一般会使用PeekMessage()这个方法,它不会被windows阻塞,从而保证整个游戏的流畅和比较高的帧速。

这个主线程维护着整个窗体以及上面的子控件。当它得到一个消息,就会调用DispatchMessage方法派遣消息

你可能感兴趣的:(委托,C#,Invoke,BeginInvoke)