You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:36:03