[vb.net]使用多线程

以下是线程的基本操作
Dim Td As System.Threading.Thread '定义一个线程
Td = New System.Threading.Thread(AddressOf abc) '实例化(abc是个过程不能带参数,启动线程后就在一个单独的线程内执行abc过程)
Td.Start() '开始运行线程
System.Threading.Thread.Sleep(500) '延时500毫秒
Td.Abort() '中止线程

现在我们来试试多线程用起来怎么样
    Dim Td As System.Threading.Thread '定义一个线程
    Dim n As Int32

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Td = New System.Threading.Thread(AddressOf abc) '实例化,指向abc过程
        Td.Start() '开始运行线程
    End Sub
    Sub abc()
        For n = 0 To 100000000
            System.Threading.Thread.Sleep(10) '让它走慢一点
        Next
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        MsgBox(n) '可以看到n在变
    End Sub
可以看到在执行abc这个过程时,程序并没有失去响应,这就是多线程的一个优势
忘了关闭线程了,在我们关闭窗口后,这个线程没运行完的话,还会继续走
    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Td.Abort() '结束线程
    End Sub

下面我们改一改,加个textbox显示n
    Sub abc()
        For n = 0 To 100000000
            TextBox1.Text = n
            System.Threading.Thread.Sleep(10) '让它走慢一点
        Next
    End Sub
它会报错:
线程间操作无效: 从不是创建控件“TextBox1”的线程访问它。

在创建的线程内不能访问控件,那怎么办了,下面就要说到通过委托访问控件
Delegate Sub Dg(ByVal v As Int32) '声明一个委托,根据你委托的过程写,还有函数形式的,delegate function Dg(byval v as int32) as int32
Dim Dg_txt As New Dg(AddressOf txt) '定义,实例化一个委托,指向txt这个过程(这个过程可以带参数)
Me.Invoke(Dg_txt, n) '执行指定的委托,ntxt过程需要的参数

以下是具体使用
把委托声明放外面
Public Class Form1
    Dim Td As System.Threading.Thread '定义一个线程
    Dim n As Int32
    Delegate Sub Dg(ByVal v As Int32) '声明一个委托

abc过程改下:
    Sub abc()
        Dim Dg_txt As New Dg(AddressOf txt) '定义,实例化一个委托,指向txt这个过程
        For n = 0 To 100000000
            Me.Invoke(Dg_txt, n) '执行指定的委托,n传进去
            System.Threading.Thread.Sleep(10) '让它走慢一点
        Next
    End Sub
增加一个过程
    Sub txt(ByVal i As Int32)
        TextBox1.Text = i
    End Sub

button1,可以看到textbox1的数字狂飙,而我们还可以做其它事,也不会出现无响应的情况,以上只是一个应用多线程的一个小示例

最后说下委托的这个过程txt,它的运行依然是占用原始线程的,你在这个过程内放个大循环,或者sleep,就会看到程序失去响应
所以除了关键的涉及到控件的,其它的运算都尽量放在Td线程指向的过程abc,才能发挥多线程的优点

猜你喜欢

转载自blog.csdn.net/lihongmao5911/article/details/7728652