private void OnRecvCompleted(object hSender, SocketAsyncEventArgs hE) { try { if (hE.IsDisconnect()) { m_hRecvOps.Recycle(hE); throw new SocketException(); } //Begin another Receive Operation m_iToDataToConsume += hE.CopyTo(m_hRecvBuffer, ref m_iCurrentOffset); //Warning: race condition with next call m_hRecvOps.Recycle(hE); byte bId; ushort uDataSize; int iPacketIndex = 0; while (m_hRecvBuffer.ContainsPacket(iPacketIndex, m_iCurrentOffset, m_iToDataToConsume, out bId, out uDataSize)) { m_hMs.Seek(iPacketIndex + Packet.DataSizeIndex, SeekOrigin.Begin); IAction hAction = Interpreter.Get(bId); hAction.LoadData(m_hReader); iPacketIndex += Packet.HeaderSize + uDataSize; m_iToDataToConsume -= Packet.HeaderSize + uDataSize; ServingMode.Execute(hAction); m_hRecvBuffer.Reorder(iPacketIndex, ref m_iCurrentOffset); } this.StartRecv(); } catch (Exception hEx) { Console.WriteLine(hEx.Message); Service.Recycle(this); } }