新手学习,共同进步。
一、先上代码
Imports System.Threading.Thread
Public Delegate Sub testDelegate(ByVal text1 As String) '声明委托类
Public Class Form1
Private Sub AppendText(ByVal text1 As String) '声明一个方法,给文本框添加内容 ,该方法和委托要匹配(签名一致)
Me.TextBox1.Text = text1 'Me可以省略
End Sub
Private Sub changeName(ByVal text1 As String) '声明一个方法,给窗体换名字,该方法也和委托要匹配(签名一致)
Me.Text = text1
End Sub
Private Sub method1(ByVal text2 As String) '声明线程调用的方法一
'Me.Invoke(New testDelegate(AddressOf AppendText), 参数) ’ 参数被实参代替
Me.Invoke(New testDelegate(AddressOf AppendText), "跨线程在控件文本框中添加内容。")
End Sub
Private Sub method2(ByVal text2 As String) '声明线程调用的方法二
Me.Invoke(New testDelegate(AddressOf changeName), "跨线程给窗体换名字")
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Label1.Text = ""
Dim XCheng1 As New Threading.Thread(AddressOf method1)
XCheng1.Start()
Dim XCheng2 As New Threading.Thread(AddressOf method2)
XCheng2.Start()
End Sub
End Class
二、 本例中跨线程做了两件事(添加文本和改窗体名字)。之所以写两个是想说明同一个委托可以对应多个方法,只要方法和委托的签名一致都可以。不明白签名的人再多看看书,查查资料。
三、跨线程访问控件必须要借用委托完成。这里我说一下自己对这个过程的认识
1、我想做一件事(比如文本框中添加内容)但是我自己做不了。因为跨线程不能直接操作主线程控件
2、既然自己做不了那就只能委托能做的人去帮忙做(注意了!注意了!新人注意了!下面告诉你谁会做——control.Invoke)
3、control.Invoke是vb.net内置函数,作用是:在主线程上,用指定的自变量参数列表执行指定的委托(这也是必须用委托的原因吧)。作为新手的我也不明白control.Invoke与Me.Invoke区别,看了一些帖子都没有介绍这个。我们姑且把Me=Form1、 control=控件。反正不影响我对它的使用了。
4、现在事情就明朗了,就是我可以通过control.Invoke函数完成跨线程访问控件(我自己做的事就是调用control.Invoke函数。这就是代码中“method1方法和method2方法”和代码中的“ Dim XCheng1 As New Threading.Thread(AddressOf method1)此类语句”)
5、我不能做的事就交给control.Invoke函数中的委托完成(委托匹配的方法,是主线程控件才能完成操作)
6、最后用个事例说明这个过程:我的家里被小偷光顾了,我想把小偷抓住,但是我自己不能抓小偷,抓小偷只能警察可以做,因此我就委托警察帮我抓小偷。a、我就是主线程外的一个线程;b、警察就是相当于control.Invoke函数;c、小偷就相当于在主线程中的控件;d、线程中加载方法相对于我到警局报案;e、声明委托相当于警察接了我的报案;f、委托匹配的方法就相当于警察抓住小偷的方法。
四、使用延申
1、a委托类 b、委托匹配方法 c、Sub方法 d、新线程
2、Sub方法也可以是新线程加载方法里的一个方法调用
3、委托匹配方法基本不会变化 ,这里引用的参数一直是形参
4、Sub方法经常会发生变化,从代码中可以发现参数从这里被实参取代



