Control.Invoke和BeginInvoke机制(2)

    近日,被ControlInvokeBeginInvoke搞的头大,就查了些相关的资料,整理如下。感谢这篇文章对我的理解InvokeBeginInvoke的真正含义 


()我们用Thread来调用BeginInvokeInvoke
      
我们开一个线程,让线程执行一些耗费时间的操作,然后再用Control.InvokeControl.BeginInvoke回到用户UI线程,执行界面更新。

 代码(1)  Thread调用ControlInvoke

    Private Delegate Sub InvokeDelegate()

    Private Sub StartMethod()

        'C代码段

        TextBox.Invoke(New InvokeDelegate(AddressOf InvokeMethod))

        'D代码段

    End Sub

 

    Private Sub InvokeMethod()

        'E代码段包含了处理TextBox的代码

    End Sub

 

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesButton2.Click

        'A代码段

        Dim InvokeThread As System.Threading.Thread = New Threading.Thread(AddressOf StartMethod)

        InvokeThread.Start()

        'B代码段

    End Sub


你觉得代码的执行顺序是什么呢?记好ControlInvokeBeginInvoke都执行在主线程即UI线程上
A------>(Start
一开始BStartMethodC就同时执行)---->(C执行完了,不管B有没有执行完,invokeThread把消息封送(invoke)UI线程,然后自己等待)---->UI线程处理完butInvoke_Click消息后,处理invokeThread封送过来的消息,执行invokeMethod方法,即代码段E,处理往后UI线程切换到invokeThread线程。
这个Control.Invoke是相对于invokeThread线程同步的,阻止了其运行。

解释:
1.
UI执行A
2.
UI开线程InvokeThreadBC同时执行,B执行在线程UI上,C执行在线程invokeThread上。
3.
invokeThread封送消息给UI,然后自己等待,UI处理完消息后,处理invokeThread封送的消息,即代码段E
4.
UI执行完E后,转到线程invokeThread上,invokeThread线程执行代码段D

转载于:https://www.cnblogs.com/nevermorez/archive/2013/03/14/2960603.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值