示例#1
0
        /// <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);
                    }
                }
            }
        }