请说明在 C# 中利用 Thread 类开启一个新线程以及终止该线程的常见做法。
考察说明
考查对 C# Thread 类基本操作和线程生命周期管理的掌握。
回答思路
- 【回答框架 1】启动线程时,需要创建 Thread 对象并传入一个 ThreadStart 委托或 ParameterizedThreadStart 委托,然后调用 Start 方法。ThreadStart 用于无参方法,ParameterizedThreadStart 允许传递一个 object 参数,例如 new Thread(new ParameterizedThreadStart(MyMethod)).Start(data)。
- 【回答框架 2】停止线程不应直接调用 Abort 方法,因为这会强制终止并可能导致资源未释放或状态不一致。推荐使用协作式取消:设置一个 volatile bool 标志位或使用 CancellationToken,线程在循环中检查该标志,收到取消信号后自行退出,然后可在主线程调用 Join 等待线程结束。
- 【回答框架 3】在实际应用中,还可用 Task 或后台线程配合任务取消机制,但题目限定 Thread 类,所以重点是掌握基于标志位或 CancellationToken 的优雅退出方式。
- 【回答框架 4】需要注意线程的优先级、前台线程和后台线程的区别:默认前台线程会阻止进程退出,若希望进程结束时不等待线程,可将 IsBackground 设为 true。
- 【关键点 1】启动线程用 new Thread(方法).Start(),有参时用 ParameterizedThreadStart。
- 【关键点 2】停止线程优先用标志位或 CancellationToken 协作式取消,避免 Abort。
- 【关键点 3】线程退出后用 Join 确保主线程等待完成。
- 【关键点 4】前台线程会阻止进程退出,后台线程不会。
- 【关键点 5】Abort 会抛 ThreadAbortException,不推荐使用。
- 【易错点 1】误用 Abort 强制终止线程,可能造成资源泄漏或数据不一致。
- 【易错点 2】忘记设置 IsBackground 导致进程无法正常退出。
- 【易错点 3】标志位未用 volatile 声明或未加锁,可能导致线程间可见性问题。