当前位置: 首页 > article >正文

C#多线程精解

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

应用场景:

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

思路:

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

方法和步骤:

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

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终止线程:

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方法通知线程终止。

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


http://www.kler.cn/a/467393.html

相关文章:

  • 跨站脚本攻击(XSS)详解
  • Java重要面试名词整理(二十一):SpringSecurity
  • 实时高保真人脸编辑方法PersonaMagic,可根据肖像无缝生成新角色、风格或场景图像。
  • linux定时执行脚本的方法
  • 操作系统大题整理
  • ARM CCA机密计算安全模型之加密建议
  • 第4天:Web应用蜜罐系统堡垒机运维API内外接口第三方拓展架构部署影响
  • Tortoisegit 安装之后没有Add、ignore解决
  • 最小二乘有限差分的物理信息神经网络与物理信息神经网络的区别
  • 升级Cypress到10.8.0
  • LeetCode 力扣 热题 100道(二十九)螺旋矩阵(C++)
  • 【STC库函数】Compare比较器的使用
  • 基于Java的敬老院管理系统的设计和实现【源码+文档+部署讲解】
  • Python嵌套列表的浅拷贝与深拷贝
  • Python虚拟环境管理
  • jquery实现的网页版扫雷小游戏源码
  • 从CRUD到高级功能:EF Core在.NET Core中全面应用(一)
  • STM32-笔记26-WWDG窗口看门狗
  • 基于高斯噪声模型的信号去噪——图像相加去噪的理论保证
  • 22408操作系统期末速成/复习(考研0基础上手)
  • 前端开发语言涉及到 的集合框架(Collections Framework)
  • PHP在做api开发中,RSA加密签名算法如何使用 ?
  • Fabric环境部署-Git和Node安装
  • 蛋白互作组学系列丨(四)IP-MS数据分析
  • 基础图形化界面的一个图片爬虫期末
  • 【初阶数据结构与算法】排序算法总结篇(每个小节后面有源码)(直接插入、希尔、选择、堆、冒泡、快速、归并、计数以及非递归快速、归并排序)