Control与Delegate的invoke_与begininvoke.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Control与Delegate的invoke_与begininvoke

近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 。 (一)Control的Invoke和BeginInvoke 我们要基于以下认识: (1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。 (2)Control的Invoke和BeginInvoke的参数为delegate,委托的方法是在Control的线程上执行的,也就是我们平时所说的UI线程。 我们以代码(一)来看(Control的Invoke) private delegate void InvokeDelegate(); private void InvokeMethod(){ //C代码段 } private void butInvoke_Click(object sender, EventArgs e) { //A代码段....... this.Invoke(new InvokeDelegate(InvokeMethod)); //B代码段...... } 你觉得代码的执行顺序是什么呢?记好Control的Invoke和BeginInvoke都执行在主线程即UI线程上 A------C----------------B 解释: (1)A在UI线程上执行完后,开始Invoke,Invoke是同步 (2)代码段B并不执行,而是立即在UI线程上执行InvokeMethod方法,即代码段C。 (3)InvokeMethod方法执行完后,代码段C才在UI线程上继续执行。 看看代码(二),Control的BeginInvoke private delegate void BeginInvokeDelegate(); private void BeginInvokeMethod(){ //C代码段 } private void butBeginInvoke_Click(object sender, EventArgs e) { //A代码段....... this.BeginInvoke(new BeginInvokeDelegate(BeginInvokeMethod)); //B代码段...... } 你觉得代码的执行顺序是什么呢?记好Control的Invoke和BeginInvoke都执行在主线程即UI线程上 A-----------B---------------C慎重,这个只做参考。。。。。,我也不肯定执行顺序,如果有哪位达人知道的话请告知。 解释::(1)A在UI线程上执行完后,开始BeginInvoke,BeginInvoke是异步 (2)InvokeMethod方法,即代码段C不会执行,而是立即在UI线程上执行代码段B。 (3)代码段B执行完后(就是说butBeginInvoke_Click方法执行完后),InvokeMethod方法,即代码段C才在UI线程上继续执行。 由此,我们知道: Control的Invoke和BeginInvoke的委托方法是在主线程,即UI线程上执行的。也就是说如果你的委托方法用来取花费时间长的数据,然后更新界面什么的,千万别在UI线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死。 那么,这个异步到底是什么意思呢? 异步是指相对于调用BeginInvoke的线程异步,而不是相对于UI线程异步,你在UI线程上调用BeginInvoke ,当然不行了。----摘自Invoke和BeginInvoke的真正涵义一文中的评论。 BeginInvoke的原理是将调用的方法Marshal成消息,然后调用Win32 API中的RegisterWindowMessage()向UI窗口发送消息。----摘自Invoke和BeginInvoke的真正涵义一文中的评论。 (二)我们用Thread来调用BeginInvoke和Invoke 我们开一个线程,让线程执行一些耗费时间的操作,然后再用Control.Invoke和Control.BeginInvoke回到用户UI线程,执行界面更新。 代码(三) Thread调用Control的Invoke private Thread invokeThread; private delegate void invokeDelegate(); private void StartMethod(){ //C代码段...... Control.Invoke(ne

文档评论(0)

wf93679 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档