コード例 #1
0
ファイル: SocketAgent.cs プロジェクト: wuhuolong/MaxBooks
 // 释放对象
 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 )
     }
 }
コード例 #2
0
ファイル: SocketAgent.cs プロジェクト: wuhuolong/MaxBooks
 // 开始接收消息
 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();
     }
 }