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

不使用Thread.Abort()在.NET 6环境下立即终止C#线程的实现方案咨询

解决方案

核心实现思路

完全基于.NET官方推荐的协作式取消模型实现,不需要依赖已过时的Thread.Abort方法,兼容.NET 6及以上所有运行环境:

  • 利用CancellationToken自带的等待机制替换Thread.Sleep,实现睡眠期间立即响应取消信号
  • 在所有长耗时任务的间隔插入取消检查点,不需要等待整轮循环完成再终止
  • 优化资源释放逻辑,避免非托管资源泄漏

修改后完整代码

using System;
using System.Diagnostics;
using System.Threading;

public class Worker : IDisposable
{
    private CancellationTokenSource cts;
    private Thread t;
    private bool disposed = false;

    public Worker()
    {
        cts = new CancellationTokenSource();
        t = new Thread(() => { ThreadTask(cts.Token); });
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposed) return;
        if (disposing)
        {
            cts?.Cancel();
            t?.Join(1000); // 最多等待1秒让线程完成清理,也可以不传超时时间一直等待
            cts?.Dispose();
        }
        disposed = true;
    }

    ~Worker()
    {
        Dispose(false);
    }

    private void ThreadTask(CancellationToken ct)
    {
        try
        {
            while (!ct.IsCancellationRequested)
            {
                // 长任务1
                Debug.WriteLine("Task 1 completed");
                // 等待2秒,收到取消信号会立刻返回true,不需要等满2秒
                if (ct.WaitHandle.WaitOne(2000)) break;

                // 长任务2
                Debug.WriteLine("Task 2 completed");
                if (ct.WaitHandle.WaitOne(2000)) break;

                // 长任务3
                Debug.WriteLine("Task 3 completed");
                if (ct.WaitHandle.WaitOne(2000)) break;

                // 长任务4
                Debug.WriteLine("Task 4 completed");
                if (ct.WaitHandle.WaitOne(2000)) break;

                Debug.WriteLine("All tasks completed");
            }
            if (ct.IsCancellationRequested)
            {
                Debug.WriteLine("Cancellation requested");
            }
        }
        catch (OperationCanceledException)
        {
            Debug.WriteLine("Cancellation requested");
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Thread exception: " + ex.ToString());
        }
        finally
        {
            // 清理逻辑
            Debug.WriteLine("Thread cleanup");
        }
    }

    public void Start()
    {
        t.Start();
    }

    public void Stop()
    {
        cts.Cancel();
    }
}

关键修改说明

  • 睡眠可打断实现:将原Thread.Sleep(2000)替换为ct.WaitHandle.WaitOne(2000),该方法在收到取消信号时会立刻返回,无需等待到超时时间结束,返回值为true即代表取消信号已触发,可直接终止执行流。
  • 多检查点配置:在每个任务执行完成后都做取消判断,不需要等到下一轮循环开头才检测,大幅提升取消响应速度。如果是计算密集型的长任务,可以在任务逻辑中每隔小段代码插入一次ct.ThrowIfCancellationRequested()主动检测取消状态。
  • 资源释放优化:Worker类实现IDisposable接口替代原析构函数的释放逻辑,符合.NET资源管理规范,避免资源泄漏。

内容的提问来源于stack exchange,提问作者Pedro Duarte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:45:10