当用户在写出多线程程序的时候,可能最具有挑战性的就是独立的线程和程序的其他的部分有并发性。例如,程序中的一个独立的线程正在处理一系列的名称,而程序的另一个部分必须等待这个线程完成以后才能进行,通常处理并发性的线程的办法就是判断线程的状态或者通过一个事件去标志和得到一个特征值。
最简单的,也是效率最低的方法就是判断一个线程的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的类型必须是引用类型的,如一个类,一个模块,一个接口等等。