首页 > 其他分享 >线程暂停

线程暂停

时间:2022-10-28 12:33:41浏览次数:63  
标签:System button2 线程 暂停 using true

如何暂停一个线程

实现一个需求,在上位机项目中执行一直都PLC数据和将PLC数据写入数据的操作。当按下按钮时暂停读写操作

原理:开两个线程,每个线程执行一个死循环,在循环体内一直读PLC数据和写入数据库操作

 

方法一:通过控制flag来控制线程的暂停

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LoadDataByTask
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.button2.Text = "暂停";
        }
        bool falg = true;//控制位
        ManualResetEvent mark = new ManualResetEvent(true);
        private void button1_Click(object sender, EventArgs e)
        {
            falg = true;
            //执行读PLC数据任务
            Task.Run(() =>
            {
                while (true)
                {
                    //第一种方法

                    for (int i = 0; i < 10; i++)
                    {
                        if (falg)
                        {
                            Console.WriteLine("read data from plc" + i + ":" + System.DateTime.Now.ToString());
                            Thread.Sleep(200);
                        }
                    }                    
                }
            });
            //执行将数据写入数据库任务
            Task.Run(() =>
            {
                while (true)
                {
                    //第一种方法

                    for (int i = 0; i < 10; i++)
                    {
                        if (falg)
                        {
                            Console.WriteLine("write data " + i + ":" + System.DateTime.Now.ToString());
                            Thread.Sleep(200);
                        }
                    }                   
                }
            });
        }

        private void button2_Click(object sender, EventArgs e)
        {            
            falg = false;
        }
    }
}

 

方法一的缺点:

线程并不是真正的暂停,线程暂停后再启动CPU占用率很高,如下

 

 


方法2:使用ManualResetEvent进行控制线程的暂停

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LoadDataByTask
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.button2.Text = "暂停";
        }
        
        ManualResetEvent mark = new ManualResetEvent(true);
        private void button1_Click(object sender, EventArgs e)
        {
            falg = true;
            //执行读PLC数据任务
            Task.Run(() =>
            {
                while (true)
                {            
                    //第二种方法                    
                    for (int i = 0; i < 100; i++)
                    {
                        int k = i;
                        mark.WaitOne();
                        //Console.WriteLine("read data from plc" + k + ":" + System.DateTime.Now.ToString());
                        Console.WriteLine("read data from plc" + k + "当前线程:" + Thread.CurrentThread.ManagedThreadId.ToString());
                        Thread.Sleep(1000);
                    }
                }
            });
//执行将数据写入数据库任务 Task.Run(() => { while (true) { //第二种方法 mark.WaitOne(); for (int i = 0; i < 100; i++) { int k = i; mark.WaitOne(); //Console.WriteLine("write data " + k + ":" + System.DateTime.Now.ToString()); Console.WriteLine("write data " + k + "@" + "当前线程:" + Thread.CurrentThread.ManagedThreadId.ToString()); Thread.Sleep(1000); } } }); } private void button2_Click(object sender, EventArgs e) { if (this.button2.Text == "暂停") { mark.Reset(); this.button2.Text = "恢复"; } else { mark.Set(); this.button2.Text = "暂停"; } } } }

第二种线程暂停的方案为最佳方案,线程暂停的时候不会引起CPU占用率的增加。


 

例子:使用ManualResetEvent进行控制线程暂停的另一个例子

引用:【C#】怎样做线程的[暂停/继续]操作_哔哩哔哩_bilibili,感谢UP糖君哒

实现一个PrograssBar的暂停,效果入下:

 

标签:System,button2,线程,暂停,using,true
From: https://www.cnblogs.com/hanzq/p/16835695.html

相关文章

  • Java - 线程同步方式
    概念同步异步消息通信机制同步:发出调用之后,在没有得到结果之前,该调用不返回。调用者主动等待调用结果。异步:发出调用之后,该调用直接返回,无结果。被调用者通过状态、通......
  • C#-多线程的使用Tread
    首先是概念,什么是线程?线程是操作系统分配CPU时间的基本单元,在一个进程中可以有多个线程同时执行代码。谈一谈什么是进程?简单的说,一个正在运行的应用程序可以视为一个进......
  • 守护线程
    守护线程默认情况下,Java进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结......
  • 不同角度理解线程的状态(操作系统 & Java API)
    3.12五种状态(操作系统层面)这是从操作系统层面来描述的【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联【可运行状态】(就绪状态)指该线程......
  • Java多线程(5):CAS
     您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~  在JDK1.5之前,Java的多线程都是靠synchronized来保证同步的,这会引起很多性能问题,例如死锁。但随着Java的不断完善,J......
  • 线程状态—停止
    packagestate;publicclassTestStopimplementsRunnable{//设置一个标志位privatebooleanflag=true;@Overridepublicvoidrun(){......
  • Redis的单线程和高性能
    Redis是单线程吗?Redis的单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程。但Redis的其他功能,比如持久......
  • ESP32 多线程入门实验
    一、线程创建函数函数voidxTaskCreate(pdTASK_CODEpvTaskCode,constportCHAR*constpcNane,unsignedportSHORTusStackDepth,void*pvParameters,unsigne......
  • 【Java】线程的死锁
    1.死锁不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。说明:出现死锁后,不会出现异常,不会出现提示,只是所有的线程......
  • IDEA在多线程环境下断点调试-验证synchronized监视锁的运行状态
    场景Java中数据同步-synchronized关键字与Mointor的使用:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126743812上面简单介绍synchronized的使用,如果在I......