ncelling "
mController.Cancel()
End Sub
Start(开始)按钮只调用 Controller 对象的 Start 方法,并将 Worker 对象的实例传递给它。
您可能需要调整用于初始化 Worker 对象的值,以便在您的计算机上获得所需的结果。这些特定的值提供了双处理器 P3/450
计算机上的一个良好示例。显然,这只是用于测试目的。真正的 Worker 对象将实现更有意义、运行时间更长的进程。
Cancel(取消)按钮将调用 Controller 对象的 Cancel 方法,同时还会更新显示,以表明已请求取消。请记住,这只是一个取消“请求”,在辅助线程真正停止运行之前可能需要等待一些时间。最好能够为用户提供即时反馈,至少应让用户知道系统已经注意到用户的单击按钮操作。
现在,我们可以运行应用程序了。单击 Start(开始)按钮时,Worker 就应该开始运行,而且显示的内容会在运行时更新。您可以将窗体移动到屏幕上的任意位置,也可以与其交互,因为 UI 线程本质上还处于空闲状态,可以随时与您交互。
同时,辅助线程在后台进行大量复杂的工作,并定期将状态更新信息发送给 UI 线程以进行显示。
小结
多线程是一个功能强大的工具,我们可以在每次需要执行长时间运行的任务时使用该工具。我们可以用它运行辅助代码,而无需绑定用户界面。但同时要注意,多线程操作非常复杂,要正确操作并不容易,而且调试起来也比较困难。
尽管不一定能够实现,但我们还是应该尽量为每个辅助线程提供一组它可以操作的独立数据。要达到这个目的,最简单的方法就是为每个线程创建一个对象,对象中包含该线程可以操作的数据以及完成工作所需的代码。
通过实现结构化的架构,使之充当辅助线程和 UI 线程之间的媒介,我们可以大大简化编写多线程代码和 UI 以对其进行控制的过程。本文就介绍了这样一个架构,您可以根据需要使用或进行调整,以满足特定的应用需要。