需求:TCP通讯中客户端与服务端交互会有若干中指令,例如完成一个客户度登录过程,必须先建立握手连接,然后登录,假设服务端规定这个过程中,握手连接必须先建立起来,然后才能登录,不得越级。如何让程序顺序执行?

假设通讯指令涉及如下三个指令:

Send_ConnectToServer、Send_ClientSayHello、Send_Login

使用委托的方法,首先建立委托,参数就用实体类传入,这样比较简单,假设实体类

MessageEntity

申明委托:

public delegate string ProcessDelegate(Costaco.Mid.HPInterface.MessageEntity pEntity);

申明任务列表:

public ProcessDelegate [] mProcess;
public int mProcessIndex = 0;\\任务执行的索引
对Send_ConnectToServer、Send_ClientSayHello、Send_Login分别建立三个方法,例: 

 
  
  1. private string Send_ConnectToServer(MessageEntity pEntity)  
  2. {  
  3.         if (mTcpCli.IsConnected == false)  //mTcpCli是我建立的异步通讯Class
  4.         {  
  5.             mTcpCli.Connect(this.txtIP.Text.Trim(), Convert.ToInt32(this.txtPort.Text));  
  6.             mTcpCli.Send(new byte[] { });  
  7.         }  
  8.         mProcessIndex = mProcessIndex + 1;  
  9.  
  10.         return "";  
  11. }  

 例如要建立一个调用任务列表,可以按如下代码:

 

 
  
  1. mProcess = new ProcessDelegate[3];  
  2.  
  3. mProcess[0] = new ProcessDelegate(Send_ConnectToServer);  
  4. mProcess[1] = new ProcessDelegate(Send_ClientSayHello);  
  5. mProcess[2] = new ProcessDelegate(Send_hs_validate);  
  6.  
  7. mProcessIndex = 0;  
  8. #region 调用任务列表中的第一个任务  
  9.  
  10. if (mProcessIndex < mProcess.Length)  
  11. {  
  12.     mProcess[mProcessIndex].Invoke(mEntity);  
  13. }  
  14. #endregion 调用任务列表中的第一个任务  

 在通讯的解析程序中,监测到数据已经完整接收,并且已经解析,则可以调用下一个任务,执行如下代码即可

 

 
  
  1. #region 调用任务列表中的其它任务  
  2.  
  3. if (mProcessIndex < mProcess.Length)  
  4. {  
  5.     mProcess[mProcessIndex].Invoke(mEntity);  
  6. }  
  7. #endregion 调用任务列表中的其它任务  

 由于没有写测试代码,是项目中使用,因此没有拿出整个程序,这部分代码已经是完整的了。关键在于建立和调用,也就是

mProcess = new ProcessDelegate[3];

mProcess[0] = new ProcessDelegate(Send_ConnectToServer);
mProcess[1] = new ProcessDelegate(Send_ClientSayHello);
mProcess[2] = new ProcessDelegate(Send_hs_validate);

 mProcess[mProcessIndex].Invoke(mEntity);