栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

跨线程访问控件,委托,vb.net

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

跨线程访问控件,委托,vb.net

新手学习,共同进步。

一、先上代码

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方法经常会发生变化,从代码中可以发现参数从这里被实参取代

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/979918.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号