C# lock示例

发布时间 2023-12-14 14:56:18作者: 不务正业的冯工

这两天项目加了个需求,需要给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通讯时,另一个线程不能使用。