|
IClient 还定义了 Start 方法,但是该方法可以从 UI 线程调用,因此不需要委托。
下面编写将从 UI 线程调用的代码。代码中包括 constructor 方法、Start 和 Cancel 方法以及 Percent 属性。我将这些内容放入 Region 中,便于大家清楚地了解它们是从 UI 线程调用的。
#Region " 从 UI 线程调用的代码 "
' 使用客户端初始化 Controller
Public Sub New(ByVal Client As IClient)
mClient = CType(Client, Form)
End Sub
' 此方法由 UI 调用,因此在
' UI 线程上运行。此处我们将
' 启动辅助线程
Public Sub Start(Optional ByVal Worker As IWorker = Nothing)
' 如果辅助线程已经启动,将产生错误
If mRunning Then
Throw New Exception("Background process already running"
End If
mRunning = True
' 存储对辅助对象的引用,并
' 初始化辅助对象,使其包含
' 对 Controller 的引用
mWorker = Worker
mWorker.Initialize(Me)
' 创建后台线程
' 以进行后台操作
Dim backThread As New Thread(AddressOf mWorker.Start)
' 开始后台工作
backThread.Start()
' 告诉客户端后台工作已开始
CType(mClient, IClient).Start(Me)
End Sub
' 此代码由 UI 调用,因此在 UI
' 线程上运行。它只设置了请求
' 取消的标志
Public Sub Cancel()
mRunning = False
End Sub
' 返回完成百分比值,并且
' 只被 UI 线程调用
Public ReadOnly Property Percent() As Integer
Get
Return mPercent
End Get
End Property
#End Region
此处唯一比较特殊的代码位于 Start 方法中,我们可以在该方法中创建辅助线程然后启动该线程:
Dim backThread As New Thread(AddressOf mWorker.Start)
backThread.Start() |
|