Thread.Start()后代码不执行需检查委托绑定错误,如误写MyMethod()而非MyMethod;前台线程阻止进程退出,后台线程则随进程终止;应禁用Thread.Abort(),改用CancellationToken轮询;多数场景优先选Task而非Thread。

Thread.Start() 之后代码不执行?检查委托绑定和参数传递
常见错误是直接写 new Thread(MyMethod) 却忘了加括号或委托转换,导致编译失败或静默不执行。C# 要求 Thread 构造函数接收的是 ThreadStart 或 ParameterizedThreadStart 委托,不能传方法调用结果。
- 正确写法:
new Thread(MyMethod)(传方法名,不带()) - 如果方法带参数,必须用
ParameterizedThreadStart:new Thread(MyMethodWithParam),然后Start(obj) - 更安全的做法是用 lambda 包一层:
new Thread(() => MyMethod("hello")),避免类型推导出错
主线程退出后子线程自动终止?看 IsBackground 属性
默认创建的 Thread 是前台线程(IsBackground == false),但它的生命周期并不阻止进程退出——真正决定进程是否存活的是“还有没有前台线程在运行”。如果主线程结束,所有前台线程已退出,进程就收工,后台线程会被强行终止。
- 想让子线程随主线程结束而安静退出?设
thread.IsBackground = true - 想等子线程做完再退出?用
thread.Join(),但注意会阻塞当前线程 - 别依赖
Thread.Sleep等待——它不可靠,且无法响应取消信号
Thread.Abort() 已废弃,怎么安全停止线程?
Thread.Abort() 在 .NET Core 和 .NET 5+ 完全不可用,.NET Framework 中也标记为过时。强行中断线程会导致资源泄漏、死锁或对象状态不一致。
- 改用
CancellationToken配合轮询:把CancellationToken传进线程逻辑,在循环中定期检查token.IsCancellationRequested - 不要在线程里捕获
ThreadAbortException——它不会抛了 - 避免共享变量做“停止标志”,除非用
Volatile.Read/Volatile.Write或lock,否则可能因 CPU 缓存不一致读不到最新值
Thread vs Task:什么时候非得用 Thread 类?
绝大多数场景该用 Task(比如 Task.Run()),它由线程池管理,开销小、支持 async/await、能自然传播异常和取消信号。只有极少数情况才需要显式 Thread:
- 需要设置线程名称(
thread.Name = "Worker")用于调试 - 需要独占线程并控制其优先级(
thread.Priority = ThreadPriority.AboveNormal) - 必须使用单线程 Apartment(如 COM 组件要求
ApartmentState.STA) - 长时间运行、不希望占用线程池资源(比如一个常驻监听线程)
用 Thread 写长任务却忘了设 IsBackground = true,很容易让程序关不掉——这是最常被忽略的一点。










