首页 > 其他分享 >【多线程笔记】如何优雅关闭线程

【多线程笔记】如何优雅关闭线程

时间:2023-06-27 16:22:55浏览次数:32  
标签:CancellationToken CancellationTokenSource 优雅 cancellationTokenSource 标识 workerTh

在C#中,可以使用CancellationToken来优雅地关闭线程。CancellationToken是一个结构体,用于向线程发送信号以请求线程停止运行。以下是一个使用CancellationToken的示例代码:

using System;
using System.Threading;
public class Worker
{
    private CancellationTokenSource _cancellationTokenSource;
    private Thread _workerThread;
    public void Start()
    {
        _cancellationTokenSource = new CancellationTokenSource();
        _workerThread = new Thread(() => Work(_cancellationTokenSource.Token));
        _workerThread.Start();
    }
    public void Stop()
    {
        _cancellationTokenSource.Cancel();
        _workerThread.Join();
    }
    private void Work(CancellationToken cancellationToken)
    {
        while (!cancellationToken.IsCancellationRequested)
        {
            // do some work here
        }
    }
}

的一些问题。

CancellationToken的原理是发送一个取消请求来通知线程停止执行。当CancellationToken的Cancel方法被调用时,CancellationTokenSource对象将发出一个取消请求。线程可以检查CancellationToken的IsCancellationRequested属性来确定是否已经取消了请求。

实际上,CancellationToken是在.NET Framework 4.0中引入的,作为一种可用于取消异步操作、任务和线程的通用机制。CancellationToken的实现方式是通过一个标识位来实现的。当CancellationTokenSource对象的Cancel方法被调用时,标识位被设置为true。线程在执行过程中会定期检查这个标识位,如果标识位为true,线程就会停止执行。

使用CancellationToken的好处是可以避免直接强制关闭线程可能引起的一些问题。例如,如果线程正在处理一些文件或者数据库事务,直接强制关闭线程可能会导致文件或者数据库状态不一致。使用CancellationToken可以让线程自己完成正在进行的工作,然后停止执行。这样可以避免一些潜在的问题,并且提高代码的可靠性和稳定性。

标签:CancellationToken,CancellationTokenSource,优雅,cancellationTokenSource,标识,workerTh
From: https://www.cnblogs.com/fanfan-90/p/17509195.html

相关文章

  • ConcurrentHashMap并不是绝对线程安全的
    ConcurrentHashMap是线程安全的概念已经深入人心,让我们在使用的时候有些大意了,我也懒得动脑子,直接使用,结果碰到钉子了. 这个问题让我很郁闷,程序逻辑全是对的,但是问题却明明摆在那边,最后怀疑是HashMap的问题。 1.package2.3.import4.import5.import6.7.impor......
  • java线程监控-jstack+jvisualvm
    Java线程监控一.Jstasck1.查找进程ps-ef|greptomcat-oa2.使用jstack监控jstack2429二、jvisualvm1.tomcat应用环境配置1.1tomcat环境配置修改tomcat中,catalina.sh文件cd/usr/src/tomcat-pinter/binvicatalina.sh在第二行添加如下:JAVA_OPTS="-Dcom.sun.mana......
  • 线程池处理异步任务
    点击查看代码/***异步任务线程池(单例)*用于异步执行任务*/publicclassThreadPoolSingleton{privatestaticfinalAtomicReference<ThreadPoolSingleton>INSTANCE=newAtomicReference<>();privatefinalExecutorServiceexecutor;privateTh......
  • 一行命令使用 Docker 编译 Latex 文件,简单优雅
    使用Docker编译LaTeX文章LaTeX是一种常用的排版系统,它可以帮助用户创建漂亮、专业的文档。但是,安装和配置LaTeX比较麻烦,特别是对于初学者而言。Docker是一个开源平台,可以让用户通过容器化技术来构建、发布和运行应用程序。使用Docker容器可以避免依赖问题,从而使得在不......
  • 使用 nuxt3 开发简约优雅的个人 blog
    起因很早前我就有过搭建个人博客的想法,但是我希望使用纯前端实现,这样就不需要付出额外的后端维护成本,维护成本又低,而且更加安全。网上也有很多博客框架但是也不符合我的需求,所以我使用了nuxt3+ts搭建了自己的个人博客,更加贴合个人需求,在功能和样式也能做到随心所欲前端的同学......
  • tqt507 pthread 多线程测试 atomic 原子操作
    ////tqt057测试结果find/opt-name*atomic.h*//aarch64-linux-gnu-gccdemoatomic.c-odemoatomic-pthread-I/opt/EmbedSky/TQT507/CoreA/longan/kernel/linux-4.9/tools/include//cp./demoatomic/home/book/nfs_rootfs#include<linux/atomic.h>#inclu......
  • Java程序CPU消耗分析之找出最耗CPU线程
    java程序CPU消耗过高一般有两种情况:1、us过高,应用占用CPU资源过高,需找出具体占用CPU的线程所执行的代码,分析定位问题原因。分析步骤如下:(1)使用top命令找出占用cpu最高的JAVA进程(2)找出占用cpu最高的线程top-Hp1781(3)占CPU最高线程17596换算成16......
  • jmeter中跨线程调用变量
    Jmeter中跨线程调用变量一.Jmeter中线程运行规则1.各个线程组是完全独立的,每个线程组是不同的业务,互不影响2.线程组中的每个线程也是完全独立3.线程组中的每个线程,都是从上往下执行,完成一轮循环后,继续下一轮循环4.存在业务流或者接口之前存在依赖关系的放同一个线程组5.setup......
  • 多进程和多线程以及协程的创建模板
    【一】开启多进程的创建模板(基于Process模块)【1】方式一:创建多进程importmultiprocessingdefworker(n):"""子进程要执行的任务"""print(f'子进程{n}正在执行')defmain():task_lists=[]foriinrange(100)#创建一个进程对象......
  • spring中的bean是否是线程安全的
    Spring中的bean是否线程安全,与Spring本身是无关的。Spring中会提供很多线程安全方面的策略,因此Spring中的bean也不具备线程安全的特性在Spring的作用域中,有以下几种;prototype(多例)每次getBean得到时候都会创建一个新的对象singleton(单例)在Spring容器中只存在一个全局共......