1.自由线程(Free Threading)
Visual Studio.net允许用户开发多条互不相干的多线程的应用程序。也就是说,当用户在执行一个程序的时候,也可以在另外一条的线程独立地运行另外一个任务程序,这种过程被称为自由线程(free threading)。对于用户而言,自由线程概念的引入,使得应用程序对用户的响应将更加积极,因为任务处理器能够在某个线程正在运行时,依然保持界面对用户的响应,只要对用户响应的线程正在运行。而且,自由线程在运行大型的程序的时候,也将会很有用,因为随着运行任务的增加,用户可以多开辟几个线程来运行程序。
建立和使用一个新的线程
用户可以通过声明一个变量类型System.Threading来建立一个新的线程。并且还提供了一个Address操作和一个用户想运行的过程或方法。例如:
Dim mythread as New System.Threading.thread(AddressOf MySub)
用户可以使用"Start"方法来开始一个线程,例如thread.Start()。用"Stop"方法来终止一个线程。
2.关于线程的参数和返回值的问题
给一个过程建立一个新的线程是一个简单的问题,但是还是有一些重要的问题需要强调一下,例如当运行一个新的线程的时候,用AddressOf操作运行的方法或过程并没有注释和参数,而且不能返回值,为了解决这个问题,下面有几种比较简单的方法,可以给线程设定一些参数,并且从一些独立的线程的过程中返回值。
1.为新建立的线程设置参数
因为在建立一个新的线程类的时候,只使用了一个AddressOf操作,这样就不能给一个即将要独立运行的线程设置一些具有标示性的议论。
最好的办法就是把一些需要对自由线程中的方法设置的参数设置成为一个新的线程的属性的值。这样做的优点就是每当用户新建一个新的线程对象的时候,这个对象可以有自己的属性值,也就是说,它可以具有它自己的参数。
2.从自由线程的过程中返回参数
因为当用户运行一个独立的线程的时候,在线程中只能是过程而不能是函数,也不能用ByRef来引用,所以用户必须通过一些其他的技术来从线程中得到所需要的信息到自己的程序中去。最简单的办法就是通过设置全局变量,当某个线程结束以后就给某个全局变量赋值,然而,正如上述这种方法是应该要避免的,而且如果要这样做的话,用户还必须事先先判断线程是不是已经结束了,才能去访问那些全局变量,这样的话,无疑降低了程序的效率和准确性。
从一个线程的过程中返回值的最好办法就是,把需要返回的值作为一个参数建立一个事件,通过执行这个事件,就可以得到所需要的返回值。如果事件运行以后,同时用户所需要的返回值是某个全局变量的话,可以干脆把这个事件设置为返回全局变量。当线程结束以后,主程序就可以利用那些事件返回的值进行下一步操作。
3.vb.net的并发性问题
当用户在写出多线程程序的时候,可能最具有挑战性的就是独立的线程和程序的其他的部分有并发性。例如,程序中的一个独立的线程正在处理一系列的名称,而程序的另一个部分必须等待这个线程完成以后才能进行,通常处理并发性的线程的办法就是判断线程的状态或者通过一个事件去标志和得到一个特征值。
最简单的,也是效率最低的方法就是判断一个线程的IsAlive属性的值,当一个线程在开始(Start)以前它的属性IsAlive的值是"False",而在它运行的过程中,它的属性IsAlive的值是"True"。这种方法并没有通过一个事件去标志和得到一个特征值可靠,而且如果这样做的庆,也失去了自由线程的很多优点和便利之处。例如:
while anotherthread.IsAlive=False
End While
'While anotherthread.IsAlive=True
End While
一个更好的处理线程并发性的办法就是使用事件,每一个线程都能够运行一个事件把它自己的状态以一个标志的形式给主程序一个值,或者是给其他一个线程一个具有标志自身状态后个值,这样当多个线程在运行一个过程的多个拷贝的时候,这些线程都具有自己特有的事件来标志各自的状态,则在线程之处的程序的其他的部分,就可以通过运行这些事件,得到线程的信息,并且进行下一步的信息的处理。例如:
Public Event Status(Byval ThreaStatus As Integer,Byval ThreadID As Integer)
vb.net 提供了SyncLock表述来使得在一个expression中一些statements可以具有并发性,这保证了多个线程在运行时不在同一时间里,运行相同的statements,当进入了SyncLock模块,共享的方法System.Monitor.Enter将在特定的expression下运行,一直到这个特定的线程对expression返回的对象有exclusive Lock以后,模块中的代码才会停止运行。
注意:expression的类型必须是可引用的那种类型
补充:SyncLock表述
语法:
SyncLock expression
...[Block]
End SyncLock
expression
功能:
SyncLock表述,能够确保多线程不在同一个时间内,运行相同的statements,当一个线程运行到一个SyncLock模块,并不是马上就执行模块里的代码,而是等到对expression返回的对象有锁定(lock)的权力。这使得expression在几个线程运行的时候改变了值,以至产生一些不可预料的错误。
注意:expression的类型必须是引用类型的,如一个类,一个模块,一个接口等等。