// 释放对象 internal void Dispose() { if (Interlocked.CompareExchange(ref DisposedCAS, 1, 0) == 0) // CAS ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - LOCK ( SpinLock ) // Lock objects : InnerSocket { LOCK(ref InnerSocketLockRoot); try { if (InnerSocket.Connected) { InnerSocket.Shutdown(SocketShutdown.Both); } InnerSocket.Close(); } finally { UNLOCK(ref InnerSocketLockRoot); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - UNLOCK ( SpinLock ) if (ConnectArgs != null) { ConnectArgs.Dispose(); } if (SendArgs != null) { SendArgs.Dispose(); } if (ReceivingMessage != null) { ReceivingMessage.Dispose(); } if (SendingMessage != null) { SendingMessage.Dispose(); } // 归还缓冲区 BufferHandler.RecyclingBuffer(ReceiveBuffer); ReceiveBuffer = null; // 清空并释放接收消息队列 int length = ReceiveMessageQueue.Count; for (int i = 0; i < length; i++) { ReceiveMessageQueue[i].Dispose(); } ReceiveMessageQueue.RemoveRange(0, length); // 清空并释放发送消息队列 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - LOCK ( SpinLock ) // Lock objects : SendMessageQueue LOCK(ref SendMessageQueueLockRoot); try { length = SendMessageQueue.Count; for (int i = 0; i < length; i++) { SendMessageQueue[i].Dispose(); } SendMessageQueue.RemoveRange(0, length); } finally { UNLOCK(ref SendMessageQueueLockRoot); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - UNLOCK ( SpinLock ) } }
// 开始接收消息 internal void StartReceiveMessage() { if (ConnectedCAS == 1 && !InnerSocket.Connected) { Disconnect(); } if (ConnectedCAS == 0 || DisposedCAS == 1 || InnerSocket.Available == 0) { return; } // 解析消息 try { while (InnerSocket.Available > 0) { ParseMessage(); } } catch { Disconnect(); } // 调用侦听 while (ReceiveMessageQueue.Count > 0) { SocketMessage message = ReceiveMessageQueue[0]; ReceiveMessageQueue.RemoveAt(0); if (MessageListeners[message.Info.Protocol] != null) { int length = MessageListeners[message.Info.Protocol].Count; for (int i = 0; i < length; i++) { if (i == 0) { InvokeListener(MessageListeners[message.Info.Protocol][i], message); } else { SocketMessage clone = message.Clone(); InvokeListener(MessageListeners[message.Info.Protocol][i], clone); clone.Dispose(); } } } message.Dispose(); } }