首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

询问一个关于异步socket编程的有关问题,主要是关于waitone()函数的有关问题

2011-12-24 
询问一个关于异步socket编程的问题,主要是关于waitone()函数的问题贴出一部分代码大家看下///summary///

询问一个关于异步socket编程的问题,主要是关于waitone()函数的问题
贴出一部分代码   大家看下
                ///   <summary>
                ///   开始监听
                ///   </summary>
                private   void   StartListen()
                {
                        try
                        {
                                if   (!this.IsStoped)
                                {
                                        this.Msg.Text= "连接尝试中... ";
                                        this._Connected   =   false;
                                        IPHostEntry   ipHostInfo   =   Dns.GetHostEntry(this.ServerAddress);
                                        IPAddress   ipAddress   =   ipHostInfo.AddressList[0];
                                        IPEndPoint   remoteEP   =   new   IPEndPoint(ipAddress,   this.ServerPort);

                                       
                                        this.Client   =   new   Socket(AddressFamily.InterNetwork,   SocketType.Stream,   ProtocolType.Tcp);

                                        this.Client.BeginConnect(remoteEP,   new   AsyncCallback(ConnectCallback),   Client);
                                        connectDone.WaitOne();//在这里阻塞主线程
                                        MessageBox.Show( "退出 ");
                                }
                        }
                        catch   (Exception   e)
                        {
                                this.SetText( "连接失败 "   +   e.Message);
                        }


                }

                ///   <summary>
                ///   连接回调
                ///   </summary>
                ///   <param   name= "IAR "> </param>
                private   void   ConnectCallback(IAsyncResult   IAR)
                {
                        try
                        {
                                Socket   client   =   (Socket)IAR.AsyncState;

                                client.EndConnect(IAR);//服务器没有开启的话在这里将抛异常
                                this._Connected   =   true;
                                this.SendAlarm();  
                                connectDone.set();
                        }
                        catch
                        {
                                this._Connected   =   false;
                                this.ExitServer();
                                MessageBox.Show( "即将退出 ");
                                connectDone.Set();
                        }

服务器端没有开启的时候,整个程序执行到connectDone.WaitOne();//在这里应该是阻塞主线程直到回调函数里面的connectDone.set();之后才会继续执行,可为什么第一次连接的时候是正常的,再次尝试连接的时候会先出现“退出”的对话框,而不是我想的先是”即将退出“然后connectDone.Set();执行后,才会出现主线程实现的”“退出”对话框。真是郁闷了,为什么说第二次的时候waitone()就不能阻塞住主线程了。

[解决办法]
this.Msg.Text= "连接尝试中... ";

这里改一下,变成

connectDone.Reset();
this.Msg.Text= "连接尝试中... ";

这样可以解决你提出的问题。
[解决办法]
第二次运行的时候,connectDone始终是有信号的,当然WaitOne就立即返回了,呵呵,用AutoResetEvent试试?????????

热点排行