近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 。
(一)我们用Thread来调用BeginInvoke和Invoke
我们开一个线程,让线程执行一些耗费时间的操作,然后再用Control.Invoke和Control.BeginInvoke回到用户UI线程,执行界面更新。
代码(1) Thread调用Control的Invoke
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
你觉得代码的执行顺序是什么呢?记好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开线程InvokeThread,B和C同时执行,B执行在线程UI上,C执行在线程invokeThread上。
3.invokeThread封送消息给UI,然后自己等待,UI处理完消息后,处理invokeThread封送的消息,即代码段E
4.UI执行完E后,转到线程invokeThread上,invokeThread线程执行代码段D