赛罕区城乡建设局网站天元建设集团有限公司 李增启 电话

当前位置: 首页 > news >正文

赛罕区城乡建设局网站,天元建设集团有限公司 李增启 电话,运营活动策划方案,字体设计教程网站近日#xff0c;被Control的Invoke和BeginInvoke搞的头大#xff0c;就查了些相关的资料#xff0c;整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 。 (一#xff09;Control的Invoke和BeginInvoke 我们要基于以下认识#xff1a; #xff08;1#x… 近日被Control的Invoke和BeginInvoke搞的头大就查了些相关的资料整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 。 (一Control的Invoke和BeginInvoke 我们要基于以下认识 1Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。 2Control的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线程上执行完后开始InvokeInvoke是同步 (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线程上执行完后开始BeginInvokeBeginInvoke是异步 (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(new invokeDelegate(invokeMethod));   //D代码段…… } private void invokeMethod(){   //E代码段 } private void butInvoke_Click(object sender, EventArgs e) {    //A代码段…….    invokeThread new Thread(new ThreadStart(StartMethod));    invokeThread.Start();    //B代码段…… } 你觉得代码的执行顺序是什么呢?记好Control的Invoke和BeginInvoke都执行在主线程即UI线程上 A——(Start一开始B和StartMethod的C就同时执行)—-(C执行完了不管B有没有执行完invokeThread把消息封送(invoke)给UI线程然后自己等待)—-UI线程处理完butInvoke_Click消息后处理invokeThread封送过来的消息执行invokeMethod方法即代码段E处理往后UI线程切换到invokeThread线程。 这个Control.Invoke是相对于invokeThread线程同步的阻止了其运行。 解释 1。UI执行A 2。UI开线程InvokeThreadB和C同时执行B执行在线程UI上C执行在线程invokeThread上。 3。invokeThread封送消息给UI然后自己等待UI处理完消息后处理invokeThread封送的消息即代码段E 4。UI执行完E后转到线程invokeThread上invokeThread线程执行代码段D 代码(四)  Thread调用Control的BeginInvoke private Thread beginInvokeThread; private delegate void beginInvokeDelegate(); private void StartMethod(){    //C代码段……    Control.BeginInvoke(new beginInvokeDelegate(beginInvokeMethod));   //D代码段…… } private void beginInvokeMethod(){   //E代码段 } private void butBeginInvoke_Click(object sender, EventArgs e) {    //A代码段…….    beginInvokeThread new Thread(new ThreadStart(StartMethod));    beginInvokeThread .Start();    //B代码段…… } 你觉得代码的执行顺序是什么呢?记好Control的Invoke和BeginInvoke都执行在主线程即UI线程上 A在UI线程上执行—–beginInvokeThread线程开始执行UI继续执行代码段B并发地invokeThread执行代码段C————–不管UI有没有执行完代码段B这时beginInvokeThread线程把消息封送给UI单自己并不等待继续向下执行——–UI处理完butBeginInvoke_Click消息后处理beginInvokeThread线程封送过来的消息。 解释 1。UI执行A 2。UI开线程beginInvokeThreadB和C同时执行B执行在线程UI上C执行在线程beginInvokeThread上。 3。beginInvokeThread封送消息给UI然后自己继续执行代码DUI处理完消息后处理invokeThread封送的消息即代码段E 有点疑问如果UI先执行完毕是不是有可能过了段时间beginInvokeThread才把消息封送给UI然后UI才继续执行封送的消息E。如图浅绿的部分。 Control的BeginInvoke是相对于调用它的线程即beginInvokeThread相对是异步的。 因此我们可以想到。如果要异步取耗费长时间的数据比如从数据库中读大量数据我们应该这么做。 (1)如果你想阻止调用线程那么调用代码(三)代码段D删掉C改为耗费长时间的操作因为这个操作是在另外一个线程中做的。代码段E改为更新界面的方法。 (2)如果你不想阻止调用线程那么调用代码(四)代码段D删掉C改为耗费长时间的操作因为这个操作是在另外一个线程中做的。代码段E改为更新界面的方法。 相关知识1。Invoke 和 BeginInvoke 的真正涵义  2。MSDN上关于Control的Invoke和BeginInvoke的文档 3。消息机制