|
t = New Thread(AddressOf oSquare.CalcSquare)
oSquare.Value = 30
t.Start()
End Sub
Sub SquareEventHandler(ByVal Square As Double) _
Handles oSquare.ThreadComplete
MsgBox("The square is " & Square)
End Sub
这个方法需要注意的一个问题是处理事件的过程,在本例中是SquareEventHandler,将运行在引发事件的线程中,而不是运行在窗体从中执行的线程中。
线程同步
VB.NET包含了一些语句用于提供线程的同步。在Square的例子中,你可能想同步执行计算的线程以便等到计算完成,这样便可以获得结果。举另外一个例子,如果你在一个单独的线程中对数组进行排序并且在使用这个数组之前要等待这个处理过程结束。为了实现这些同步,VB.NET提供了SyncLock语句和Thread.Join方法。
SyncLock获取了对传递给它的对象引用的独占性锁。通过取得这种独占锁,你可以确保多个线程不会访问共享的数据或是在多个线程上执行代码。一个可以方便地用于获取锁地对象是关联于每个类的System.Type对象。可以通过GetType方法获得System.Type对象:
Public Sub CalcSquare()
SyncLock GetType(SquareClass)
Square = Value * Value
End SyncLock
End Sub
最后,Thread.Join方法允许你等待一段特定的时间直到一个线程结束。如果线程在你所确定的时间之前完成,Thread.Join返回True,否则的话返回False。在Square的例子中,如果我们不想引发事件,可以调用Thread.Join方法来确定计算是否已经结束。代码如下所示:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim oSquare As New SquareClass()
t = New Thread(AddressOf oSquare.CalcSquare)
oSquare.Value = 30
t.Start()
If t.Join(500) Then
MsgBox(oSquare.Square)
End If
End Sub
作者:Matthew Arnheiter是位于哈肯萨克市(Hackensack)的GoAmerica Communications公司的一名资深顾问,他还是The Visual Basic Developer''''s Guide to Design Patterns and UML (Sybex, 2000)一书的作者。可以通过(201)996-1717 x2367或Marnheiter◎goamerica.net与他取得联系。
上一页 [1] [2] [聊天工具]在你的QQ空间拼一个免费MTV播放器 [其他]在你的JDeveloper里扩展J2ME
|