Welcome

首页 / 软件开发 / .NET编程技术 / .NET中有效进行线程启动与结束的示例

在.NET中,应该避免使用Thread.Abort()强制终止线程(会导致资源泄漏和不一致状态)。推荐使用CancellationToken实现优雅的线程终止。

using System;
using System.Threading.Tasks;
class Program
{
    static async Task Main()
    {
        var cts = new CancellationTokenSource();       
        // 启动任务
        Task workerTask = Task.Run(() => WorkerMethod(cts.Token), cts.Token);       
        Console.WriteLine("主线程:等待3秒后再请求停止...");
        await Task.Delay(3000);       
        // 请求任务停止
        cts.Cancel();        
        // 等待任务完成
        try
        {
            await workerTask;
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("任务已取消");
        }
    }
    static void WorkerMethod(CancellationToken token)
    {
        int counter = 0;
        while (!token.IsCancellationRequested)
        {
            Console.WriteLine($"工作:计数 = {counter++}");
            Thread.Sleep(500);
        }
    }
}
关键点说明
使用CancellationToken:通过CancellationToken安全地通知线程停止,而不是使用Abort()
线程检查取消请求:工作线程在每次循环中检查IsCancellationRequested标志
优雅退出:线程在完成当前工作周期后退出,避免资源泄漏
Join()等待:主线程使用Join()等待工作线程安全退出
现代推荐方式
在现代.NET开发中,更推荐使用Task和async/await(比直接操作线程更强大且安全):
重要提示:永远不要使用Thread.Abort()。它可能导致死锁、资源泄漏和数据损坏,是微软官方不推荐的使用方式。
using System;
using System.Threading;
class Program
{
    static void Main()
    {
        // 创建取消令牌源(用于通知线程停止)
        var cts = new CancellationTokenSource();
        
        // 启动线程
        Thread workerThread = new Thread(() => WorkerMethod(cts.Token));
        workerThread.Start();
        
        Console.WriteLine("主线程:等待3秒后请求停止线程...");
        Thread.Sleep(3000);
        
        // 请求线程停止
        Console.WriteLine("主线程:请求线程停止...");
        cts.Cancel();
        
        // 等待线程安全退出
        workerThread.Join();
        Console.WriteLine("主线程:线程已安全退出");
    }
    static void WorkerMethod(CancellationToken token)
    {
        int counter = 0;
        Console.WriteLine("工作线程:开始运行...");
        
        while (!token.IsCancellationRequested)
        {
            // 执行工作
            Console.WriteLine($"工作线程:计数 = {counter++}");
            Thread.Sleep(500);  // 模拟工作
        }
        
        Console.WriteLine("工作线程:收到停止请求,正在退出...");
    }
}