/// <summary> /// 时间片的处理 /// </summary> internal void Slice() { // 检查有多少新的连接用户 CheckListener(); // 检查有多少新的连出用户 CheckConnecter(); NetState netState = null; if (m_NetStateQueue.TryDequeue(out netState) == false) { return; } // 如果没有需要处理的数据则返回 if (netState == null) { return; } // 处理接收到的数据 if (netState.Running == true) { ReceiveQueue receiveQueueBuffer = netState.ReceiveBuffer; if (receiveQueueBuffer == null) { throw new ArgumentNullException("receiveQueueBuffer", "MessagePump.Slice(...) - receiveQueueBuffer == null error!"); } // 检测是否已经在处理数据中,防止多线程中多次处理里面的数据 if (receiveQueueBuffer.InProcessReceive() == false) { return; } // 累积过多,会导致线程堵塞,全都在处理自我的数据包逻辑 if (netState.ReceiveBuffer.Length >= netState.ReceiveCachedMaxSize) { netState.Dispose(); // 需要注释 Logs.WriteLine(true, LogMessageType.MSG_WARNING, "NetState[{0}] Receive(...) - ReceiveBufferLength[{1}] >= ReceiveCachedMaxSize[{2}] warning (接收缓存的数据包过大)!", ToString(), netState.SendQueue.WaitSendSize, netState.ReceiveCachedMaxSize); } else { OnProcessReceive(netState); } // 已经结束处理 receiveQueueBuffer.OutProcessReceive(); } // 表示当前已不再处理列表中(减少处理列表的长度) netState.OutProcessQueue(); // 再次检测是否还有没处理完接受到的数据,如果有,再次进入处理列表(可能是半包或还有没来得急处理的数据,等待数据的完整,1秒以后再次处理,仅调用一次) if (netState.Running == true) { if (netState.ReceiveBuffer.Length > 0) { TimeSlice.StartTimeSlice(TimeSpan.FromSeconds(1.0), OnceAgainReceive, netState); } } // 有数据过来需要发送全局信号处理数据包 if (m_NetStateQueue.IsEmpty == false) { m_World.SendWorldSignal(); } }