/// <summary> /// 异步读取结束 /// </summary> /// <param name="iar">异步结果</param> private void EndRead(IAsyncResult iar) { SocketHandlerState state = (SocketHandlerState)iar.AsyncState; try { state.DataLength = state.Stream.EndRead(iar); } catch { state.DataLength = 0; } if (state.DataLength == 0) //表示Socket断开连接 { lock (StateSet) StateSet.Add(state.AsyncResult, state); state.Data = new byte[0]; //设定接收的数据为空 state.DataLength = 0; //设定接收的数据长度为0 ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续 state.AsyncCallBack(state.AsyncResult); //执行异步回调函数 return; } if (state.Completed) //如果已经完成状态,开始下次接收 { lock (StateSet) StateSet.Add(state.AsyncResult, state); ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续 state.AsyncCallBack(state.AsyncResult); //执行异步回调函数 try { state.Stream.BeginRead(state.Data, 0, 1024, EndRead, state); //继续接收数据 } catch //出现Socket异常 { lock (StateSet) StateSet.Add(state.AsyncResult, state); state.Data = new byte[0]; //设定接收的数据为空 state.DataLength = 0; //设定接收的数据长度为0 ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续 state.AsyncCallBack(state.AsyncResult); //执行异步回调函数 } } }
/// <summary> /// 异步写入结束 /// </summary> /// <param name="iar">异步结果</param> private void EndWrite(IAsyncResult iar) { SocketHandlerState state = (SocketHandlerState)iar.AsyncState; lock (StateSet) //锁定StateSet StateSet.Add(state.AsyncResult, state); try { state.Stream.EndWrite(iar); } catch //出现Socket异常 { state.Completed = false; //发送失败 ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续 state.AsyncCallBack(state.AsyncResult); //执行异步回调函数 return; } state.Completed = true; //发送成功 ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续 state.AsyncCallBack(state.AsyncResult); //执行异步回调函数 lock (SendQueue) //锁定SendQueue { SocketHandlerState prepare = null; SendQueue.Remove(state); //移除当前发送完成的数据 if (SendQueue.Count > 0) //如果SendQueue还有数据待发送,则继续发送 { prepare = SendQueue[0]; } if (prepare != null) { try { prepare.Stream.BeginWrite(prepare.Data, 0, prepare.Data.Length, EndWrite, prepare).AsyncWaitHandle.WaitOne(); //开始异步发送数据 } catch { state.Completed = false; //发送失败 ((AutoResetEvent)state.AsyncResult.AsyncWaitHandle).Set(); //允许等待线程继续 state.AsyncCallBack(state.AsyncResult); //执行异步回调函数 } } } }