VB.NET多线程编程参数的传递以及返回值的获取

下面的例子是使用多线程同时弹出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
MessageBox.Show( "Hello" +paramPM.nNum.ToString())
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,然后在处理过程中简单将两个数相加,最后返回结果。在实际使用中当然要复杂的多。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...