目的:通过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,......
请求
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,......
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();
}
}
//启动时钟,发送数据
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(); } }