首页 > 编程语言 >C#上位机开发——多线程启动停止暂停继续

C#上位机开发——多线程启动停止暂停继续

时间:2024-08-27 09:14:44浏览次数:9  
标签:CurrentValue cts C# private 上位 线程 多线程 CPU

引用:上位机开发——多线程启动停止暂停继续 - 哔哩哔哩 (bilibili.com)

前言
初学者学习编程时,很容易因为多线程出现各种问题,导致不敢使用多线程。但是多线程技术在做开发中,是不可忽视的一个技术,基本上我们实际应用中,每个项目都会使用多线程,所以多线程技术必须掌握。

为什么要用多线程
随着工业的进步,现在的笔记本、台式机大都是双核的,4核、8核甚至16核,也很常见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。

单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程”同时”运行罢了。

多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。

如果你做项目不使用多线程,不仅是技术的问题,也是对电脑资源的极大浪费,就像你买了一辆配置非常高的越野车,你仅仅只用它来日常代步一样。

为什么不敢用多线程
之前跟一些学员沟通时发现,很多学员之所以不敢使用多线程,是因为之前出过问题,有种“一朝被蛇咬,十年怕井绳”的感觉。

为什么多线程容易出问题,有个主要的原因在于多线程充满着“未知性”,有的人使用时,发现代码并没有按照预想的流程在走,这其实是正常的。

我们必须要明确一点,多线程确实是“不可控的”,有某种意义上来说,多线程是靠CPU调度来执行的,并非人为去控制。

我们所谓的控制多线程,仅仅是.NET框架开放了一些接口给开发者,这样可以相对性地间接控制多线程的启动停止暂停继续。

线程的启动停止
线程的启动停止,从.Net Framework 4.5开始,Task提供了一个叫CancellationTokenSource的对象,可以使用它来对多线程的启停进行控制。

首先,我们做一个线程任务,这个任务很简单,只是不断操作某个变量,每0.1秒加1,到一定值之后,重置为0,然后将这个值显示在界面上,界面如下所示:


所以任务方法如下:

        /// <summary>
        /// 多线程执行方法
        /// </summary>
        private void TaskMethod()
        {
            while (!cts.IsCancellationRequested)
            {
                CurrentValue++;
                if (CurrentValue == 200)
                {
                   CurrentValue = 0;
                }
                Thread.Sleep(100);
            }
        }

我们可以看到在方法里调用了一个cts对象,这个对象就是CancellationTokenSource的对象,因此我们需要创建一个CancellationTokenSource对象cts:

        /// <summary>
        /// 线程启停控制
        /// </summary>
        private CancellationTokenSource cts;

然后在启动线程按钮的事件里,编写代码如下:

        private void btn_Start_Click(object sender, EventArgs e)
        {
            cts = new CancellationTokenSource();
            Task.Run(() =>
            {
                TaskMethod();
            }, cts.Token);
        }

停止线程按钮的事件里,只需要调用cts的Cancel方法即可:

        private void btn_Stop_Click(object sender, EventArgs e)
        {
            cts.Cancel();
            CurrentValue = 0;
        }

其实,说白了,就是通过cts来控制cts的IsCancellationRequested属性,进而实现多线程的控制。

线程的暂停继续
多线程的暂停继续,.NET为我们提供了另外一个对象——ManualResetEvent,这个对象会有一个值,这个值是布尔类型,就像一个门闸一样,True是打开门闸,False是关闭门闸,所以想要暂停多线程就调用这个对象的Reset方法,想要继续多线程就调用这个对象的Set方法,使用非常简单。

首先我们创建一下这个对象,可以通过构造方法,给这个对象赋初始值,我这里为True,这样就能直接运行,不会阻塞。

        /// <summary>
        /// 线程暂停控制,默认开启
        /// </summary>
        private ManualResetEvent manual = new ManualResetEvent(true);

但是如果希望这个对象与多线程有所联系,必须要在多线程的方法里体现这个对象的作用,这个是调用这个对象的WaitOne方法,表示在调用的地方阻塞住,通过判断True或者False来决定是否继续执行,就像大家开车过高速收费站一样,即使现在普遍采用ETC了,在入口也需要减速,有一个ETC识别的过程,识别成功才会抬杆,识别识别,杆子是不会自动抬起的,这个是一样的道理。

所以线程执行代码如下:

        /// <summary>
        /// 多线程执行方法
        /// </summary>
        private void TaskMethod()
        {
            while (!cts.IsCancellationRequested)
            {
                manual.WaitOne();

                CurrentValue++;

                if (CurrentValue == 200)
                {
                   CurrentValue = 0;
                }
                Thread.Sleep(100);
            }
        }

对比一下,其实就是加了一个manual.WaitOne()。

线程暂停代码:

        private void btn_Pause_Click(object sender, EventArgs e)
        {
            manual.Reset();
        }       

线程继续代码:

        private void btn_Continue_Click(object sender, EventArgs e)
        {
            manual.Set();
        }

AutoResetEvent
AutoResetEvent和ManualResetEvent的用法非常相似,区别在于一个是手动,一个是自动,AutoResetEvent会在置位之后自动复位,这样体现在多线程里,就是会只执行一次,就像大家进小区一样,如果有10辆车在排队,这时候如果自动模式,每次只能进一辆车,如果是手动模式,可以由保安控制门闸打开,等10辆车都进去之后,再由保安将门闸关注。 

标签:CurrentValue,cts,C#,private,上位,线程,多线程,CPU
From: https://www.cnblogs.com/HarryK4952/p/18381980

相关文章

  • Cyberchef实用功能之-模拟沙箱的文件静态分析能力
    本文将介绍如何使用cyberchef提取文件的重要元数据的信息,根据自己的需求实现沙箱中的静态文件的分析能力。在网络安全日常的运营,护网行动,重保活动的过程中,样本的分析是一个重要的过程,这些可疑或者恶意的样本的来源有如下几种:数据包流量中提取的样本EMAIL邮件附件中提取的......
  • JVM(Java Virtual Machine,Java虚拟机)
    JVM(JavaVirtualMachine,Java虚拟机)是Java平台的核心组成部分,它负责运行Java程序。JVM使得Java程序能够“一次编写,到处运行”(WriteOnce,RunAnywhere),这是Java语言的一个重要特性。JVM通过在不同的操作系统上提供统一的运行时环境来实现这一特性。JVM的主要组成部分JVM主......
  • java反序列化——CC1链
    参考【【Java反序列化链】CommonsCollections1深入浅出,详细分析(cc1链)】【Java反序列化链】CommonsCollections1深入浅出,详细分析(cc1链)_哔哩哔哩_bilibilijava反序列化是java安全中非常重要的一点,也是最难的一点,我只能勉强跟着链子走一遍附上一些浅显的理解。 CC1链也......
  • 2024年智能计算与数据挖掘国际学术会议 (ICDM 2024)
    在线投稿:学术会议-学术交流征稿-学术会议在线-艾思科蓝艾思科蓝(原艾思学术网)致力于学术会议服务,本栏目是关于的学术会议与论文征稿启事,为广大学者提供学术面对面交流平台,免费发布学术会议平台,精彩线上线下会议让学术交流活动永不间断,促进学术交流传播。https://ais.cn/u/YbMnY......
  • 智能科技的浪潮:AI、ML、DL和CV的探索之旅
    智能科技的浪潮:AI、ML、DL和CV的探索之旅前言人工智能:智能科技的基石从专用到通用:AI的分类与演进机器学习:数据中的智慧算法的力量:经典与创新深度学习:解锁复杂性之门神经网络的深度:基础与应用计算机视觉:赋予机器“看”的能力从看到理解:CV的挑战与应用未来展望:技术的融合与......
  • 深入理解 UCOSIII 软件定时器
    一、引言在嵌入式系统开发中,定时器是一种非常重要的工具。UCOSIII作为一款广泛应用的实时操作系统,其软件定时器功能为开发者提供了强大的定时解决方案。本文将深入探讨UCOSIII软件定时器的工作原理、使用方法以及实际应用中的注意事项。二、UCOSIII软件定时器概述UCOS......
  • 探索OpenCV:图像处理基础与实践
    探索OpenCV:图像处理基础与实践前言图像读取基础安装OpenCV库读取彩色与灰度图像RGB颜色模型颜色通道解析单通道图像显示感兴趣区域(ROI)图像处理进阶技巧图像打码图像组合图像缩放结语前言  在当今数字化时代,图像不仅是我们日常生活中不可或缺的一部分,也是科学研......
  • LeetCode 算法:爬楼梯 c++
    原题链接......
  • Echarts实现双x轴,支持均分和非均分的情况
    效果图代码<template><divclass="app"><divclass="demo"ref="demoRef"></div></div></template><script>import*asechartsfrom'echarts'exportdefault{data()......
  • [SCSS] Media breakpoint util mixin
    $breakpoints:('phone':(320px,480px),'pad':(481px,768px),'notebook':(769px,1024px),'desktop':(1025px,1200px),'tv':1201px,)@mixinrespond-to($breakname){$bp:map-g......