bsp; mOuter = OuterSize
End Sub
'' 由 Controller 调用,以便获取
'' Controller 的引用
Private Sub Init(ByVal Controller As IController) _
Implements IWorker.Initialize
mController = Controller
End Sub
Private Sub Work() Implements IWorker.Start
Dim innerIndex As Integer
Dim outerIndex As Integer
Dim value As Double
Try
For outerIndex = 0 To mOuter
If mController.Running Then
mController.Display("Outer loop " & outerIndex & " starting")
mController.SetPercent(CInt(outerIndex / mOuter * 100))
Else
'' 它们请求取消
mController.Completed(True)
Exit Sub
End If
For innerIndex = 0 To mInner
'' 此处进行一些有意思的计算
value = Math.Sqrt(CDbl(innerIndex - outerIndex))
Next
Next
mController.SetPercent(100)
mController.Completed(False)
Catch e As Exception
mController.Failed(e)
End Try
End Sub
End Class
我们添加了能够实现 IWorker.Initialize 的 Init 方法。Controller 将调用此方法,因此以后我们可以引用 Controller 对象。
我们还将 Work 方法更改为 Private,只是为了实现 IWorker.Start 方法。此方法将在辅助线程上运行。
我们增强了 Work 方法,使其可以使用 Try..Catch 块。这样我们可以使用 Controller 上的 Failed 方法捕捉任何错误并将其返回给 UI。
假设代码正在运行,我们调用 Controller 对象的 Display 和 SetPercent 方法,使它们随着代码的运行更新其状态和完成的百分比。
我们还定期检查 Controller 对象的 Running 属性,查看是否存在取消请求。如果存在取消请求,则停止进程,并指示由于取消请求而停止操作。
创建显示的窗体
最后,我们可以创建窗体,将其用于启动或取消后台进程。该窗体还将显示活动和状态信息。
打开 Form1 的设计器并添加两个按钮(btnStart 和 btnRequestCancel)、两个标签(Label1 和 Label2)、一个 ProgressBar (ProgressBar1) 和一个 ActivityBar (ActivityBar1),如图 7 所示。
图 7:Form1 控件的布局
该窗体需要实现 IClient,以便 Controller 对象与之交互:
Imports Background
Public Class Form1
Inherits System.Windows.Forms.Form
Implements IClient
该窗体还需要 Controller 对