C#多线程精解

概述:在C#多线程编程中,合理终止线程是关键挑战。通过标志位或CancellationToken,实现安全、协作式的线程终止,确保在适当时机终止线程而避免资源泄漏。

应用场景:

在C#多线程编程中,有时需要终止正在运行的线程,例如在用户取消操作、程序关闭等情况下。

思路:

线程终止通常涉及到合作式终止而非强制终止,因为强制终止可能导致资源泄漏和不确定的状态。一般采用标志位、信号等方式,让线程自行安全地退出。

方法和步骤:

1.使用标志位控制线程执行:

csharp 复制代码
using System;
using System.Threading;

public class Worker
{
    // 标志位,用于控制线程执行
    private volatile bool shouldStop = false;

    public void DoWork()
    {
        while (!shouldStop)
        {
            // 线程执行的工作
            Console.WriteLine("Working...");
            Thread.Sleep(1000); // 模拟工作
        }
    }

    // 设置标志位,终止线程
    public void StopWork()
    {
        shouldStop = true;
    }
}

public class Program
{
    public static void Main()
    {
        Worker worker = new Worker();

        // 启动线程执行工作
        Thread thread = new Thread(worker.DoWork);
        thread.Start();

        // 模拟运行一段时间后,终止线程
        Thread.Sleep(5000);
        worker.StopWork();

        // 等待线程结束
        thread.Join();

        Console.WriteLine("Thread stopped.");
    }
}

上述代码中,通过设置shouldStop标志位,线程在下一个循环中检查到标志位为true时自动退出。

2.使用CancellationToken终止线程:

csharp 复制代码
using System;
using System.Threading;

public class Worker
{
    // CancellationTokenSource用于生成CancellationToken
    private CancellationTokenSource cts = new CancellationTokenSource();

    public void DoWork()
    {
        CancellationToken token = cts.Token;

        while (!token.IsCancellationRequested)
        {
            // 线程执行的工作
            Console.WriteLine("Working...");
            Thread.Sleep(1000); // 模拟工作
        }
    }

    // 使用CancellationToken请求终止线程
    public void StopWork()
    {
        cts.Cancel();
    }
}

public class Program
{
    public static void Main()
    {
        Worker worker = new Worker();

        // 启动线程执行工作
        Thread thread = new Thread(worker.DoWork);
        thread.Start();

        // 模拟运行一段时间后,终止线程
        Thread.Sleep(5000);
        worker.StopWork();

        // 等待线程结束
        thread.Join();

        Console.WriteLine("Thread stopped.");
    }
}

上述代码中,通过CancellationToken及其关联的CancellationTokenSource,在StopWork方法中调用Cancel方法通知线程终止。

在实际应用中,需要根据具体场景选择合适的终止线程的方式,并确保线程能够在终止时完成清理工作。

相关推荐
xiaoye37085 小时前
Java 自动装箱 / 拆箱 原理详解
java·开发语言
ZTLJQ6 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python
夏霞6 小时前
c# signlar 客户端传递参数给服务端配置方法
开发语言·c#
武藤一雄6 小时前
从零构建C# OOP 知识体系
windows·microsoft·c#·.net·.netcore·oop
KD6 小时前
阿里云服务迁移实战(二)——网关迁移与前后端分离配置
后端
迷藏4946 小时前
**发散创新:基于 Rust的开源权限管理系统设计与实战**在现代软件架构中,**权限控制**早已不
java·开发语言·rust·开源
升鲜宝供应链及收银系统源代码服务7 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
2301_818419017 小时前
C++中的解释器模式变体
开发语言·c++·算法
唐青枫7 小时前
C#.NET ConcurrentStack<T> 深入解析:无锁栈原理、LIFO 语义与使用边界
c#·.net
跟着珅聪学java7 小时前
js编写中文转unicode 教程
前端·javascript·数据库