首页 > 编程语言 >C#多线程精解:优雅终止线程的实用方法与技巧

C#多线程精解:优雅终止线程的实用方法与技巧

时间:2024-02-18 09:00:28浏览次数:32  
标签:Thread C# void Worker 线程 终止 多线程 public

 

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

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

 

标签:Thread,C#,void,Worker,线程,终止,多线程,public
From: https://www.cnblogs.com/hanbing81868164/p/18018739

相关文章

  • Docker 安装 Mysql5.7 容器
    1、首先拉取mysql5.7镜像dockerpullmysql:5.72、查询是否下载完成 查询所有镜像dockerimages3、创建mysql容器并启动dockerrun-d\#-d后台运行 -p3306:3306\#端口号映射到主机的端口号前面的端口号可以更改--namemysql\#启动容器的名字-eMYS......
  • DSACTF 十一月挑战赛 IceTea
    DSACTF十一月挑战赛IceTea非常感谢C26H52大佬的博文,否则我个狒狒连官方wp都看不懂。拿到第一个http流,很长串Hex密文,丢进cyberchef发现是ELF文件,注意这里不要搞多了,然后丢进IDA发现需要upx脱壳,注意这里是要用4.2版本的3.95的貌似不行。然后发现多了一串字符串base字母表。然......
  • 用ChatGPT4.0生成PPT,30秒搞定!
    用ChatGPT4.0生成PPT在遇见ChatGPT之前,我很难想象,仅仅不到30秒就能创建一个视觉效果出色、内容丰富的演示文稿。对于那些对制作PPT一窍不通的人来说,这样的PPT绝对能够让人自豪地展示给他人。最近,ChatGPT在互联网上风靡一时,相信大家都对它有所耳闻。作为一个无所不能的AI机器人......
  • Docker系列--网络的配置
    原文网址:​​Docker系列--网络的配置_IT利刃出鞘的博客-CSDN博客​​简介说明本文介绍Docker的网络的配置。分享Java技术星球(自学精灵):​​learn.skyofit.com​​官网网址​​https://docs.docker.com/engine/reference/commandline/network/​​网络的默认设置Docker启动......
  • ABC341
    T1:Print341模拟代码实现n=int(input())print('1'+'01'*n)T2:ForeignExchange模拟代码实现n=int(input())a=list(map(int,input().split()))foriinrange(n-1):s,t=map(int,input().split())x=a[i]//sa[i+1]+=t*xp......
  • xbl xbl_config last_parti QFIL
    CN:/#fdisk-l/dev/block/sdbNote:sectorsizeis4096(not512)FoundvalidGPTwithprotectiveMBR;usingGPTDisk/dev/block/sdb:8192sectors,32.0MLogicalsectorsize:4096Diskidentifier(GUID):6231a3fe-971e-e980-9a6a-ed770c389cacPartitiontableho......
  • CF396C On Changing Tree
    看到距离有关可以联想到跟深度有关系,可以用深度表示距离关系。假设现在有一操作1vxk,那么对于v下一点u,设dep[v]为v的深度,那么两点间距离就是dep[u]-dep[v],于是u点就会增加\(x-k*(dep[u]-dep[v])=x-k*dep[u]+k*dep[v]\)。由此来看,只需要把v一下的\(sum1\)都加上\(x-dep[u]\),......
  • 手把手教你如何下载中国大学mooc慕课上已关闭的视频课程和课件资料
    随着线上教育的普及,越来越多的大学开始提供线上教育,以方便学生的在线学习。然而,有些课程在结束后就会被关闭,导致学生无法再次观看。如果你想下载这些已经关闭的视频课程,该怎么办呢?其实我们可以通过一些工具来下载这些已关闭的课程。这里以中国大学Mooc网站为例,教大家如何下载Mooc......
  • AtCoder Beginner Contest 341
    AtCoderBeginnerContest341做得太慢了,原因BC题意很难懂,而且一开始AtCoderBetter加载不出来,不好翻译(先用10min做的AB。其中B好几次读错题。看C发现题面这么长压根看不懂,先看小清新D。发现一眼出思路,二分很快写完了。后来调二分边界用了很长时间,实际上此时已经......
  • Toyota Programming Contest 2024#2(AtCoder Beginner Contest 341)(菜小白)
    A-Print341思路:给你一个整数N有N个0和N+1个1组成 01交替输出1 解法:输出10最后输出最后剩余的1即可Code:#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);intN;cin>>N......