如何使用vb.net多线程

前端之家收集整理的这篇文章主要介绍了如何使用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传进去
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内,才能发挥多线程的优点

原文链接:https://www.f2er.com/vb/257087.html

猜你在找的VB相关文章