最近在写一个网络通信的程序:
程序是这么设计的:(所有这些代码都是在一个类中的)
在主线程中启动监听线程:
            ThreadStart ts = new ThreadStart(AcceptConnect);
            Thread myThread = new Thread(ts);
            myThread.Start();
用AcceptConnect()方法处理连接
AcceptConnect()方法:
 
        private void AcceptConnect()
        {
            try
            {
                listener = new TcpListener(10001);
                listener.Start();
            }
            catch (Exception err)
            {
                lbxStatus.Invoke(setListBoxCallback, err.Message);
                return;
            }
            while (!isExit)
            {
                try
                {
                    //将事件的状态设为非终止
                    allDone.Reset();
                    //应用在异步操作完成时调用的回调方法
                    AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
                    lbxStatus.Invoke(setListBoxCallback, "等待客户连接...");
                    //开始一个异步操作接受传入的连接尝试
                    listener.BeginAcceptTcpClient(callback, listener);
                    //阻塞当前线程,直到收到客户连接信号
                    allDone.WaitOne();
                }
                catch (Exception err)
                {
                    lbxStatus.Invoke(setListBoxCallback, err.Message);
                    break;
                }
            }
        }        //ar是IAsyncResult类型的接口,表示异步操作的状态
        //是由listerner.BeginAcceptTcpClient(callback, listener)传递过来的
        private void AcceptTcpClientCallback(IAsyncResult ar)
        {
            try
            {
                //将事件状态设为终止状态,允许一个或多个等待线程继续
                //使监听线程得以继续
                allDone.Set();
                TcpListener myListener = (TcpListener)ar.AsyncState;
                //异步接收传入的连接,并创建新的TcpClient对象处理远程主机通信
                TcpClient client = myListener.EndAcceptTcpClient(ar);  
               //如果IP为192.168.1.50,回调方法用UltraReadCallback()              
                if (((IPEndPoint)(client.Client).RemoteEndPoint).Address.ToString() == "192.168.1.50")
                {
                    ReceiveRWObject = readWriteObject;                    
                    ReceiveRWObject.netStream.BeginRead(ReceiveRWObject.readBytes, 0, ReceiveRWObject.readBytes.Length, UltraReadCallback, ReceiveRWObject);
                }
                //如果IP为192.168.1.51,回调方法用UltraReadCallback2()      
                if (((IPEndPoint)(client.Client).RemoteEndPoint).Address.ToString() == "192.168.1.51")
                {
                    ReceiveRWObject2 = readWriteObject;
                    ReceiveRWObject2.netStream.BeginRead(ReceiveRWObject2.readBytes,0,ReceiveRWObject2.readBytes.Length,UltraReadCallback2,ReceiveRWObject2);
                }
                
            }
            catch (Exception err)
            {
                lbxStatus.Invoke(setListBoxCallback, err.Message);
                return;
            }
        }        //IP为.50的回调方法
        private void UltraReadCallback(IAsyncResult ar)
        {
           try
           {
               ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;
               int count = readWriteObject.netStream.EndRead(ar);               
               //这样调用一个函数可以么?                            
               JointDistance(readWriteObject.readBytes[0]);       
               readWriteObject.InitReadArray();
               readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, UltraReadCallback, readWriteObject);
            } 
            catch (Exception err)
            {
               lbxStatus.Invoke(setListBoxCallback, err.Message);
            }
            
        }        //IP为.51的回调方法
        private void UltraReadCallback2(IAsyncResult ar)
        {
            try
            {               
                ReadWriteObject readWriteObject = (ReadWriteObject)ar.AsyncState;
                int count = readWriteObject.netStream.EndRead(ar);
                //这样调用一个方法可以么?     
                JointDistance51(readWriteObject.readBytes[0]);                
                       
                readWriteObject.InitReadArray();
                readWriteObject.netStream.BeginRead(readWriteObject.readBytes, 0, readWriteObject.readBytes.Length, UltraReadCallback, readWriteObject);
            }            catch (Exception err)
            {
                lbxStatus.Invoke(setListBoxCallback, err.Message);
            }            
        }
 
        //JointDistance()
  private void JointDistance(byte s)
        {
           
        }
 //JointDistance51()
        private void JointDistance51(byte s)
        {  
           
        }
我在主线程中又开了另一个线程,委托给这个方法处理:
 private void UltraLocation()
        {
           
        }
我这个程序要实现的功能为:在UltraLocation()发送一个特定的码之后,192.168.1.50和192.168.1.51分别回传一个数据,数据接收的回调方法分别为上面的UltraReadCallback()和UltraReadCallback2(),这两个方法把数据分别交给JointDistance()和JointDistance51()处理,在这两个方法处理完数据之后,要求他们告诉UltraLocation()他们已经处理完了,让UltraLocation()发送下一个码,UltraLocation在收到JointDistance()和JointDistance51()的确认之前,是阻塞的。之后192.168.1.50和192.168.1.51回传数据,然后这样循环下去。(关于192.168.1.50和192.168.1.51怎样回传数据,大家可以不必关心,这个倒是没问题了)想问问大家,这个用什么实现比较好?用AutoResetEvent或者ManualResetEvent可以不?EventWaitHandle呢?还有若这段代码有什么问题,请大家赐教!在此先谢谢了!