Worker 类包含另一个方法,该方法用于通知
DoWork 它应当返回。此方法名为 RequestStop,如下所示:
volatile 关键字用于通知编译器,将有多个线程访问
_shouldStop 数据成员,因此它不应当对此成员的状态做任何优化假设。有关更多信息,请参见 volatile(C# 参考)。
此时,尽管辅助线程对象已存在并已配置,但尚未创建实际的辅助线程。只有当
Main 调用 Start 方法后,才会创建实际的辅助线程:
下一步,通过调用 Sleep 来将主线程中断片刻。这保证了辅助线程的
DoWork 函数在 Main 函数执行其他任何命令之前,在 DoWork 方法内部执行若干次循环:
在 1 毫秒之后,Main 将通知辅助线程对象,它应当使用
Worker.RequestStop 方法(前面已介绍)自行终止:
还可以通过调用 Abort 来从一个线程终止另一个线程,但这会强行终止受影响的线程,而不管它是否已完成自己的任务,并且不提供清理资源的机会。此示例中显示的技术是首选方法。
最后,Main 函数对辅助线程对象调用 Join 方法。此方法导致当前线程阻塞或等待,直到对象所表示的线程终止。因此,直到辅助线程返回后,Join 才会返回,然后自行终止:
此时,只有执行
Main 的主线程还存在。它会显示一条最终消息,然后返回,从而使主线程也终止。
示例
示例输出
main thread: starting worker thread... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: terminating gracefully... main thread: worker thread has terminated