下面的例子是使用多线程同时弹出4个msgBox
————————————————
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Imports
System.Threading
Public
Class
Form1
Structure
MyParameters
Dim
nNum
As
Integer
End
Structure
Public
paramPM(3)
As
MyParameters
Public
Function
sPM2(
ByVal
paramPM
As
MyParameters)
As
String
Return
""
End
Function
Private
Sub
Button1_Click(
ByVal
sender
As
System.
Object
,
ByVal
e
As
System.EventArgs)
Handles
Button1.Click
ThreadPool.QueueUserWorkItem(
New
WaitCallback(
AddressOf
sPM2),paramPM(0))
ThreadPool.QueueUserWorkItem(
New
WaitCallback(
AddressOf
sPM2),paramPM(1))
ThreadPool.QueueUserWorkItem(
New
WaitCallback(
AddressOf
sPM2),paramPM(2))
ThreadPool.QueueUserWorkItem(
New
WaitCallback(
AddressOf
sPM2),paramPM(3))
End
Sub
End
Class
|
VB.NET中多线程编程非常容易方便,只要 Dim MyThread as new system.Threading.Thread(Addressof MySub)就可以了,其中MySub是多线程中要运行的处理过程。但是如果要向线程中传递参数或者要获取线程的返回值,就不是很方便了。当然我们可以通过定义全局变量,但这会使程序的维护变得困难,增加系统开销,甚至会因线程间的并发操作导致无法预料的结果。
笔者通常采用的方法是定义一个类。在类中定义几个私有变量,用于存放参数。再定义一个带参数的构造过程,所带的参数就是我们要们要向线程中传递的参数(形参)。在构造过程中,把参数传给私有变量。再定义一个在线程中要使用的处理过程,在处理过程中就可以随意的使用私有变量来得到所需的参数。
至于返回值,可以在类中定义一个带参数的事件,在处理参数中触发事件,并把我们所需要的返回值做为参数传递出去。
在构建多线程时,先 Private WithEvents MyFirstClass as new MyClass(Arg1,Arg2....)其中Arg1,Arg2...就是我们要向线程中传递的参数(实参),然后再Dim MyThread as New System.Threading.Thread(Addressof MyFirstClass.MySub))就可以了。
在事件过程MyFirstClass_MyEvent(nReturn)中,通过nReturn就可以得到我们所要的返回值了。
代码示例:
1、类模块代码:
Public Class MyClass
dim MyArg1 as Integer
Dim MyArg2 as Integer
sub New(Byval Arg1 as Integer,Byval Arg2 as Integer)
MyArg1=Arg1
MyArg2=Arg2
End Sub
public Event MyEvent(Byval nReturn as Integer)
Public Sub MySub
Dim MyReturn as Integer=MyArg1 + MyArg2
RaiseEvent MyEvent(MyReturn)
End Sub
End Class
2、窗口模块代码:
Public Class From1
Private WithEvent MyFirstClass as New MyClass(1,3)
Private Sub MyFirstClass_MyEvent(Byval nReturn as Integer) Handles MyFirstClass.MyEvent
'nReturn中就是返回值
End Sub
本例为了抛砖引玉,只是向线程中传递两个整型参数1、3,然后在处理过程中简单将两个数相加,最后返回结果。在实际使用中当然要复杂的多。