.NET中如何立即终止指定代码执行,停止长时间运行的类实例?
停止C#中长时间运行的类实例的实现方案
推荐使用.NET官方提供的协作式取消方案,即CancellationToken + CancellationTokenSource组合,这种方式安全可控,不会出现资源泄漏、对象状态异常的问题,不推荐直接暴力终止线程。
实现步骤
1. 修复原有代码的隐藏Bug
你提供的Client代码中存在作用域问题:Run方法内重新定义了局部变量instance,会覆盖类的成员字段,导致Kill方法读取的instance永远为null,后面的实现会先修复这个问题。
2. 修改TickMe类支持取消逻辑
public class TickMe { public void Run(CancellationToken cancellationToken) { int i = 0; // 每次循环前检查是否收到取消请求 while (!cancellationToken.IsCancellationRequested) { // 也可以直接用ThrowIfCancellationRequested,收到取消请求时主动抛异常终止 // cancellationToken.ThrowIfCancellationRequested(); Thread.Sleep(1000); Console.WriteLine("tik" + i); i++; } // 此处可添加自定义的资源清理逻辑 Console.WriteLine("TickMe运行已终止"); } }
3. 改造Client类实现Kill方法
public class Client { protected TickMe instance; // 存储取消令牌源,用于发起取消请求 private CancellationTokenSource _cts; public void Run() { instance = new TickMe(); _cts = new CancellationTokenSource(); // 将耗时的Run方法放到后台线程运行,避免阻塞当前线程导致Kill无法调用 Task.Run(() => instance.Run(_cts.Token)); } public void Kill() { // 发起取消请求,TickMe的循环检测到后会自动退出 _cts?.Cancel(); // 可选:等待任务完全退出后释放资源 _cts?.Dispose(); _cts = null; } }
特殊场景说明
如果你使用的是无法修改源码的第三方库,只能采用暴力终止线程的方案(极不推荐,可能引发未知异常):
// 改造后的TickMe调用逻辑(TickMe源码不修改的场景) public class Client { protected TickMe instance; private Thread _runThread; public void Run() { instance = new TickMe(); _runThread = new Thread(instance.Run); _runThread.Start(); } public void Kill() { // .NET Framework可用Abort,.NET Core/.NET 5+已废弃Abort,仅可使用Interrupt _runThread?.Interrupt(); _runThread = null; } }
内容的提问来源于stack exchange,提问作者ssrdop
相关产品推荐
相关产品推荐

