/// <summary> /// 时间片的处理 /// </summary> internal void Slice() { // 检查有多少新的连接用户 CheckListener(); // 检查有多少新的连出用户 CheckConnecter(); NetState[] netStateArray = null; // 转换成数组减少lock处理的时间 m_LockNetStateQueue.Enter(); { do { if (m_NetStateQueue.Count == 0) { break; } netStateArray = m_NetStateQueue.ToArray(); // 清空数据,下面处理这些数据 m_NetStateQueue.Clear(); } while (false); } m_LockNetStateQueue.Exit(); // 如果没有需要处理的数据则返回 if (netStateArray == null) { return; } // 处理接收到的数据 for (int iIndex = 0; iIndex < netStateArray.Length; iIndex++) { NetState netState = netStateArray[iIndex]; if (netState.Running == true) { ReceiveQueue receiveQueueBuffer = netState.ReceiveBuffer; if (receiveQueueBuffer == null) { throw new Exception("MessagePump.Slice(...) - receiveQueueBuffer == null error!"); } // 检测是否已经在处理数据中,防止多线程中多次处理里面的数据 if (receiveQueueBuffer.InProcessReceive() == false) { continue; } OnProcessReceive(netState); // 已经结束处理 receiveQueueBuffer.OutProcessReceive(); } // 表示当前已不再处理列表中(减少处理列表的长度) netState.OutProcessQueue(); // 再次检测是否还有没处理完接受到的数据,如果有,再次进入处理列表(可能是半包或还有没来得急处理的数据,等待数据的完整,1秒以后再次处理,仅调用一次) if (netState.Running == true) { if (netState.ReceiveBuffer.Length > 0) { TimeSlice.StartTimeSlice(TimeSpan.FromSeconds(1.0), new TimeSliceStateCallback <NetState>(this.OnceAgainReceive), netState); } } } }