目的:通过modbus TCP/IP 协议访问服务器端过程:现在有2个计时器,分别传不同的指令,向服务器请求,如下代码:
 
请求     
        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            c.send("09 20 00 0A", "03");//发送请求指令
            ReciveData1();        private void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            c.send("09 34 00 0A", "03");//发送请求指令          
            ReciveData2();
         }接收:
        //从线程池接受响应数据(读T1-T10:Actual)
        private void ReciveData1()
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(LongTask1));
        }
        //从线程池接受响应数据(读T1-T10:Setpoint)
        private void ReciveData2()
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(LongTask2));
        }
       public void LongTask1(object obj)
       {
            string[] strReceive = new string[10];            strReceive = c.receive();            this.label65.Text = strReceive[0];
            this.label64.Text = strReceive[1];
            this.label63.Text = strReceive[2];
            this.label62.Text = strReceive[3];
            this.label61.Text = strReceive[4];
            this.label60.Text = strReceive[5];
            this.label59.Text = strReceive[6];
            this.label58.Text = strReceive[7];
            this.label57.Text = strReceive[8];
            this.label56.Text = strReceive[9]; 
        }
        public void LongTask2(object obj)
        {
            string[] strReceive = new string[10];            strReceive = c.receive();            this.label53.Text = strReceive[0];
            this.label52.Text = strReceive[1];
            this.label51.Text = strReceive[2];
            this.label50.Text = strReceive[3];
            this.label49.Text = strReceive[4];
            this.label48.Text = strReceive[5];
            this.label47.Text = strReceive[6];
            this.label46.Text = strReceive[7];
            this.label45.Text = strReceive[8];
            this.label44.Text = strReceive[9];
        }问题:如何通过队列,或者锁,对他们响应的数据进行异步处理。
      现在的结果是响应回来的数据,不能异步显示,会产生交叉显示。
      如: this.label65.Text =60,......
           this.label53.Text =50,......
      会出现这样的结果:
           this.label65.Text =50,......
           this.label53.Text =60,......

解决方案 »

  1.   

    已用简单方法解决了下,,,,能达到我的要求,殊不知:稳定否?//定时发送请求(读T1-T10:Actual)
            private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                lock (this)
                {
                    c.send("09 20 00 0A", "03");//发送请求指令
                    ReciveData1();
                }         
              
            }
            private void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                lock (this)
                {
                    c.send("09 34 00 0A", "03");//发送请求指令          
                    ReciveData2();            
                }
            }
      

  2.   

    用一个计时器:
         //启动时钟,发送数据
                System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
                timer1.Tick += new EventHandler(timer1_Elapsed);
                //timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
                timer1.Interval = 1000;//毫秒            timer1.Enabled = true;
     private void timer1_Elapsed(object sender, EventArgs e)
            {
                //lock (this)
                //{
                //    c.send("09 20 00 0A", "03");//发送请求指令 (读T1-T10:Actual)
                //    ReciveData1();
                //    Thread.Sleep(1000);
                //}
                lock (this)
                {
                    c.send("09 20 00 0A", "03");//发送请求指令 (读T1-T10:Actual)
                    LongTask1();
                    c.send("09 34 00 0A", "03");//发送请求指令    (读T1-T10:Setpoint)       
                    LongTask2();
                    c.send("09 48 00 0A", "03");//发送请求指令 (读1B-10B:Actual)
                    LongTask3();
                    c.send("09 5C 00 0A", "03");//发送请求指令 (读B1-B10:Setpoint)
                    LongTask4();            }        }