首页 > 编程语言 >C# lock示例

C# lock示例

时间:2023-12-14 15:02:09浏览次数:40  
标签:mNum Console Thread 示例 C# lock WriteLine msg

这两天项目加了个需求,需要给PLC发心跳信号

我又不想在原来的循环中加,所以想着再弄个timer来定时发信号。

只是这样会有一个问题,就是冲突。

两个线程之间,有可能同时与plc发生通讯,引起数据混乱。

        private void button1_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(() =>
            {
                for(int i = 0; i < 1000; i++)
                {
                    runTask1("线程1");
                }
                
            });
            t1.Start();

            Thread t2 = new Thread(() =>
            {
                for (int i = 0; i < 1000; i++)
                {
                    runTask2("线程2");
                }
            });
            t2.Start();
        }


        public static readonly object lockObj = new object();


        public int mNum = 0;
        public void runTask1(string msg)
        {
            //Thread t1 = new Thread(()=> {
                
            //});

            lock (lockObj)
            {
                Console.WriteLine("任务1执行。。。"  + mNum.ToString() + "," + msg);
                Thread.Sleep(10);
                Console.WriteLine("任务1结束。。。"  + mNum.ToString() + "," + msg);
                Thread.Sleep(10);
                mNum++;
            }

        }


        //public int mNum = 0;
        public void runTask2(string msg)
        {
            //Thread t1 = new Thread(()=> {

            //});

            lock (lockObj)
            {
                Console.WriteLine("任务2执行。" + mNum.ToString() + "," + msg);
                Thread.Sleep(5);
                Console.WriteLine("任务2结束。" + mNum.ToString() + "," + msg);
                Thread.Sleep(8);
                mNum++;
            }

        }

        public void runTask3(string msg)
        {
            //Thread t1 = new Thread(()=> {

            //});

            lock (lockObj)
            {
                Console.WriteLine("任务3执行。****" + mNum.ToString() + "," + msg);
                Thread.Sleep(5);
                Console.WriteLine("任务3结束。****" + mNum.ToString() + "," + msg);
                Thread.Sleep(8);
                mNum++;
            }

        }


        private void button2_Click(object sender, EventArgs e)
        {
            if (timer1.Enabled)
            {
                timer1.Stop();
            }
            else
            {
                timer1.Start();
            }
            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            runTask3("时钟任务。");
        }

  

所以就 要使用lock

在某个线程和PLC通讯时,另一个线程不能使用。

 

标签:mNum,Console,Thread,示例,C#,lock,WriteLine,msg
From: https://www.cnblogs.com/kuangzhuaikuxuandiaozhatian/p/17901171.html

相关文章

  • Codeforces Round 787 (Div. 3)D. Vertical Paths
    题目链接题意:给定一棵树,将这棵树划分成几天互不相交的链,要求最小化链的数量思路:每个叶子节点一定在一条链中,所以链的数量就是叶子节点的数量,从叶子节点往上跳直到根节点,边跳边标记,路径上所有点都属于这条链。坑:数据大时,不要轻易使用memset不然会t到起飞vector不要开太多就比......
  • C练习题——打印两个数的最大公约数
    算法一:暴力求解(效率不够)#include<stdio.h>intmain(){inta=0;intb=0;scanf("%d%d",&a,&b);intmin=a<b?a:b;while(1){if((a%min==0)&&(b%min==0))break;......
  • 别再重复造反射轮子了,Spring 中的 ReflectionUtils 工具类,应有尽有!
    作者:策马踏清风链接:https://www.jianshu.com/p/756778f5dc87ReflectionUtils是spring针对反射提供的工具类。handleReflectionException异常处理推荐一个开源免费的SpringBoot实战项目:https://github.com/javastacks/spring-boot-best-practice源码:publicstaticv......
  • 真实照片与人工智能生成的艺术:新标准 (C2PA) 使用 PKI 来显示图像的历史
    https://www.asiaregister.com/zh/news/zhen-shi-zhao-pian-yu-ren-gong-zhi-neng-sheng-cheng-de-yi-shu-xin-biao-zhun-C2PA-shi-yong-PKI-lai-xian-shi-tu-xiang-de-li-shi-2661.htm在网上辨别真假变得越来越困难。Adobe、微软、索尼、DigiCert和数十家其他行业领导者推出的......
  • P2053 [SCOI2007] 修车
    题意有\(n\)个工人,\(m\)个工作。每个人给每个工作有\(t_{i,j}\)的花费。求每个工作的最小平均花费。Sol直接连边跑费用流不好搞。考虑将每种工人在不同时间做的工作暴力建点。枚举\(k\)表示第\(i\)个工人在倒数第\(k\)个做\(j\)工作。这样仍然不好考虑贡献,......
  • 软件测试/人工智能|教你掌握 Conda 的基本用法
    前言作为一名技术爱好者或者开发人员,我们可能经常需要管理不同版本的软件包或创建独立的开发环境。Conda是一个强大的工具,能够帮助我们轻松完成这些任务。接下来,我们将介绍Conda的基本概念和常用操作,帮助大家快速上手。什么是Conda?Conda是一个开源的软件包管理系统和环境......
  • 网络七层协议和TCP
    搭建环境使用nc工具搭建一个TCP服务器。服务端使用命令创建监听端口nc-l-p1023客户端使用命令连接nc<目标ip>-p1023以上使用tcpdump或者wireshark进行抓包搭建环境如下![[Pastedimage20231214135926.png]]使用wireshark抓包如下![[Pastedimage20231214092055.......
  • Chat2DB接入文心一言AI教程(原创教程,转载请注明)
    引言关于Chat2DB和文心一言是啥我就不赘述了,由于Chat2DB自带的ai有调用次数限制,所以想着接入百度的文心AI,但是由于网上没有找到相关的教程,此方法是本人研究了一段时间才弄出来的,顺便记录一下备忘,也希望对有同样需求有所帮助!一、注册并实名认证百度智能云账号百度智能云地址:点击......
  • vscode格式化代码
    第一步:安装三个插件:​​Prettier-Codeformatter​​​、​​ESLint​​​、​​Vetur​​。第二步:修改配置文件MacOS使用​​Command+Sheft+P​​​,windows使用​​Ctrl+Sheft+P​​搜索首选项:打开设置(json),然后把下面配置粘贴进去:Preferences:OpenW......
  • 2020CVPR_High-Resolution Image Synthesis with Latent Diffusion Models
    1.AutoEncoderAutoEncoder(自编码器)是一种无监督学习的神经网络模型,用于学习有效的数据表示。它的目标是将输入数据编码成一种潜在的、紧凑的表示形式,然后从这个表示中重构原始输入。自编码器由两部分组成:编码器(Encoder)和解码器(Decoder)。编码器(Encoder):将输入数据映射到潜在表示空......