首页 > 其他分享 >多线程的启/停,暂停和恢复

多线程的启/停,暂停和恢复

时间:2022-11-25 09:58:21浏览次数:47  
标签:CurrentValue cts 对象 恢复 private 线程 暂停 多线程

 

多线程的启动停止

线程的启动停止,从.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,对象,恢复,private,线程,暂停,多线程
From: https://www.cnblogs.com/hanzq/p/16924204.html

相关文章

  • 多线程与高并发
    一、Volatile1.1可见性read(读取):从主内存读取数据load(载入):将主内存读取到的数据写入工作内存use(使用):从工作内存读取数据来计算assign(赋值):将计算好的值重新赋值到......
  • Java——多线程:Lamda表达式
    多线程理解继承Thread类子类继承Thread类具备多线程能力启动线程:子类对象.start()不建议使用:避免oop单继承局限性实现Runnable接口实现接口Runnable具有多......
  • centos双系统恢复windows启动项
    在网上教程​​http://www.centoscn.com/image-text/setup/2014/0728/3365.html​​的指引下在win10的系统下安装完centos7之后,莫名其妙原来Windows的启动引导消失了......
  • java多线程(一)
    初始化线程的四种方式1、继承Threadpublicstaticvoidmain(String[]args){System.out.println("main....statt");newThread01().start();Sy......
  • 电脑无法开机系统无法启动,如何进行数据恢复?
    电脑是现在工作和学习必不可少的设备之一,个人的重要资料都保存在电脑硬盘里。平时使用电脑的时候,难免会遇到数据丢失问题。电脑数据丢失是很常见的问题,例如,误格式化、误删除......
  • 恢复 IIS Express SSL证书 ,IIS Express 调试站点 ERR_CONNECTION_RESET
    前言:一波未平,另一波又起...之前写了篇“Asp.NetCore作为服务(WindowsService)部署与SSL设置整理”随笔,在操作过程中把IISExpress的证书给删掉了,然后其他程序......
  • Python爬虫如何实现多线程异步
    如果自己的电脑配置高操作系统可以多任务运行的,应该首先要考虑单核CPU是怎么执行多任务的,操作系统会让各个任务交替执行。例如:任务1执行0.02秒,切换到任务2,任务2执行0.02秒,再......
  • 多线程的那点儿事(之大结局)
      多线程一直是我比较喜欢的话题,当然也是很多朋友比较害怕的话题。喜欢它,因为它确实可以提高pc的使用效率;讨厌它,因为如果对它处理不好,反而会导致更大的麻烦。这里断断续......
  • 多线程的那点儿事(之多核编程)
      多核编程并不是最近才兴起的新鲜事物。早在intel发布双核cpu之前,多核编程已经在业内存在了,只不过那时候是多处理器编程而已。为了实现多核编程,人们开发实现了几种多......
  • 搜索引擎的那些事(多线程web遍历)
       上面一篇博客当中,我们可以利用单一的线程完成网页的下载。今天,我们打算在此基础上完成多线程的访问和加载操作。使用多线程,倒不是因为这项技术有多牛,主要是因为我们......