询问一个关于异步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试试?????????