Пример #1
0
        /// <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);                    //执行异步回调函数
                }
            }
        }
Пример #2
0
        /// <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);                    //执行异步回调函数
                    }
                }
            }
        }