如何使用vb.net多线程

可能一些小程序用不上,单线程就可以完成,但是很多程序往往需要多个线程同时操作,或者用辅助线程来完成主线程的工作,    多线程对于一个程序员来说是一个必须逾越的槛。最近在写一个程序,设备要同时登陆3台设备,如果使用单线程排队完成,时效性就达不到要求,应次没办法必须要学习多线程,那么如何使用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) '执行指定的委托,n是txt过程需要的参数

以下是具体使用
把委托声明放外面,完整代码如下:
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 as integer = 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

  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

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

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

展开阅读全文

没有更多推荐了,返回首页