none
Socket 伪同步 AutoResetEvent 的问题 RRS feed

  • 问题

  • 程序有两个模块:收消息模块线程 、 连接服务器线程

     

    ///阻塞

    private AutoResetEvent clientDone = new AutoResetEvent(false);

     

            /// <summary>
            /// 是否连接成功
            /// </summary>
            private bool isConnect = false;

     

           #region 接收消息模块
            /// <summary>
            /// 实时监听接收
            /// </summary>
            internal void ReceiveListener(){

                SocketAsyncEventArgs recargs = new SocketAsyncEventArgs();

                while(running){

                    //接收消息

                    bool flag = socket.ReceiveAsync(recargs);

                    if(flag ){

                       recargs.Completed += new EventHandler<SocketAsyncEventArgs>(ReceiveBack);

                       clientDone.WaitOne();

                    }

                }

           }

           internal void ReceiveBack(object sender, SocketAsyncEventArgs e){

               if(e.SocketError == SocketError.Success){
                   isSend = true;
               }

               clientDone.Set();

           }

     

     

            #region 连接服务器线程

            /// <summary>
            /// 连接服务器线程

            /// </summary>
            internal bool ConnectListener(){

                //连接状态
                isConnect = false;

                //定义并实例一个Socket参数
                SocketAsyncEventArgs args = new SocketAsyncEventArgs();

                //设置到远程终节点属性(实际使用中,请将下面的Ip地址换成scoket服务器所在的IP)
                args.RemoteEndPoint = endPoint;

                //设置好当Socket任何一个动作完成时的回调函数。
                args.Completed += new EventHandler<SocketAsyncEventArgs>(ConnectBack);

                //执行连接。
                socket.ConnectAsync(args);
                clientDone.WaitOne();
                return isConnect;

           }

           internal void ConnectBack(object sender, SocketAsyncEventArgs e){

               if(e.SocketError == SocketError.Success){
                   isConnect  = true;

               }

               clientDone.Set();

           }

     

     

    现在连接模块是30S调一次。

    ConnectBack----> clientDone.Set();

    程序直接执行ReceiveListener ---> clientDone.WaitOne();

    ConnectListener 没在向下执行了

    我的的需求是:ConnectBack----> clientDone.Set();后执行ConnectListener 的后续代码

    ReceiveListener应该一直等待到ConnectListener 执行完才执行;

    2011年8月4日 3:39

答案

全部回复