コード例 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="netState"></param>
        /// <param name="packetReader"></param>
        internal static void Realm_HandleRegisterRealmResult(NetState netState, PacketReader packetReader)
        {
            RealmExtendData extendData = netState.GetComponent <RealmExtendData>(RealmExtendData.COMPONENT_ID);

            if (extendData == null)
            {
                Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRegisterRealmResult(...) - extendData == null error!");
                return;
            }

            if (extendData.IsLoggedIn == true)
            {
                Debug.WriteLine("Realm_PacketHandlers.Realm_HandleRegisterRealmResult(...) - extendData.IsLoggedIn == true error!");
                return;
            }

            uint iRealmSerial = packetReader.ReadUInt32();

            extendData.RegisterRealmResult.Serial = new Serial(iRealmSerial);

            // 已经登陆
            extendData.IsLoggedIn = true;

            // 3分钟 向服务端发一次心跳信号
            TimeSlice.StartTimeSlice(TimerPriority.Lowest, TimeSpan.FromMinutes(3), TimeSpan.FromMinutes(3), new TimeSliceCallback(SendPing));

            LOGs.WriteLine(LogMessageType.MSG_INFO, "RealmServer:登陆RealmServer服务器成功 返回的标示ID({0})", extendData.RegisterRealmResult.Serial.ToString());
        }
コード例 #2
0
        /// <summary>
        ///
        /// </summary>
        public static void StartLoadAccountTimeSlice()
        {
            s_UnitOfWork.Connection       = new SqlConnection(OneDatabase.ConnectionURL);
            s_UnitOfWork.AutoCreateOption = AutoCreateOption.SchemaOnly;

            ReloadAccount();

            TimeSlice.StartTimeSlice(TimerPriority.Lowest, s_RefreshAccountTimeSpan, s_RefreshAccountTimeSpan, new TimeSliceCallback(WowAccountHandler.ReloadAccount));
        }
コード例 #3
0
        /// <summary>
        /// 开始运行数据保存的时间片
        /// </summary>
        internal void StartSaveTimeSlice()
        {
            if (m_LockSaveTimeSlice.InLock() == false)
            {
                return;
            }

            // 启动BaseWorld保存数据的时间片
            m_SaveTimeSlice = TimeSlice.StartTimeSlice(m_SaveTimeSpan, m_SaveTimeSpan, new TimeSliceCallback(this.OnSave));
        }
コード例 #4
0
        public void StartTimeSliceTest10()
        {
            TimeSpan          delayTimeSpan = new TimeSpan(); // TODO: 初始化为适当的值
            TimeSliceCallback timerCallback = null;           // TODO: 初始化为适当的值
            TimeSlice         expected      = null;           // TODO: 初始化为适当的值
            TimeSlice         actual;

            actual = TimeSlice.StartTimeSlice(delayTimeSpan, timerCallback);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("验证此测试方法的正确性。");
        }
コード例 #5
0
        /// <summary>
        /// 初始化在线状态的检查
        /// </summary>
        internal void StartCheckAllAliveTime()
        {
            if (m_LockCheckAlive.InLock() == false)
            {
                return;
            }

            // 检测用户是否超时
            // 创建检测用户是否超时的时间片(默认5分钟)
            m_CheckAliveTimeSlice = TimeSlice.StartTimeSlice(TimerPriority.Lowest, m_CheckAliveTime, m_CheckAliveTime, new TimeSliceCallback(this.CheckAllAlive));
        }
コード例 #6
0
        /// <summary>
        ///StartTimeSlice 的测试
        ///</summary>
        public void StartTimeSliceTest6Helper <T>()
        {
            TimeSpan delayTimeSpan = new TimeSpan();              // TODO: 初始化为适当的值
            TimeSliceStateCallback <T> timerStateCallback = null; // TODO: 初始化为适当的值
            T         tState   = default(T);                      // TODO: 初始化为适当的值
            TimeSlice expected = null;                            // TODO: 初始化为适当的值
            TimeSlice actual;

            actual = TimeSlice.StartTimeSlice <T>(delayTimeSpan, timerStateCallback, tState);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("验证此测试方法的正确性。");
        }
コード例 #7
0
        public void StartTimeSliceTest7()
        {
            TimerPriority     processPriority  = new TimerPriority(); // TODO: 初始化为适当的值
            TimeSpan          delayTimeSpan    = new TimeSpan();      // TODO: 初始化为适当的值
            TimeSpan          intervalTimeSpan = new TimeSpan();      // TODO: 初始化为适当的值
            TimeSliceCallback timerCallback    = null;                // TODO: 初始化为适当的值
            TimeSlice         expected         = null;                // TODO: 初始化为适当的值
            TimeSlice         actual;

            actual = TimeSlice.StartTimeSlice(processPriority, delayTimeSpan, intervalTimeSpan, timerCallback);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("验证此测试方法的正确性。");
        }
コード例 #8
0
        public void StartTimeSliceTest17()
        {
            TimeSpan delayTimeSpan    = new TimeSpan();       // TODO: 初始化为适当的值
            TimeSpan intervalTimeSpan = new TimeSpan();       // TODO: 初始化为适当的值
            TimeSliceStateCallback timerStateCallback = null; // TODO: 初始化为适当的值
            object    tState   = null;                        // TODO: 初始化为适当的值
            TimeSlice expected = null;                        // TODO: 初始化为适当的值
            TimeSlice actual;

            actual = TimeSlice.StartTimeSlice(delayTimeSpan, intervalTimeSpan, timerStateCallback, tState);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("验证此测试方法的正确性。");
        }
コード例 #9
0
        /// <summary>
        /// 开始更新世界
        /// </summary>
        public void StartUpdateWorld(TimeSpan updateWorldSpeed)
        {
            m_UpdateWorldSpeed = updateWorldSpeed;

            if (m_UpdateWorldTimeSlice != null)
            {
                m_UpdateWorldTimeSlice.IntervalTime = m_UpdateWorldSpeed; // 如果存在了就只改变间隔时间
            }
            else
            {
                // 启动更新世界的时间片
                m_UpdateWorldTimeSlice = TimeSlice.StartTimeSlice(m_UpdateWorldSpeed, new TimeSliceCallback(this.OnUpdateWorld));
            }
        }
コード例 #10
0
        /// <summary>
        ///StartTimeSlice 的测试
        ///</summary>
        public void StartTimeSliceTest4Helper <T>()
        {
            TimerPriority processPriority  = new TimerPriority(); // TODO: 初始化为适当的值
            TimeSpan      delayTimeSpan    = new TimeSpan();      // TODO: 初始化为适当的值
            TimeSpan      intervalTimeSpan = new TimeSpan();      // TODO: 初始化为适当的值
            long          iCount           = 0;                   // TODO: 初始化为适当的值
            TimeSliceStateCallback <T> timerStateCallback = null; // TODO: 初始化为适当的值
            T         tState   = default(T);                      // TODO: 初始化为适当的值
            TimeSlice expected = null;                            // TODO: 初始化为适当的值
            TimeSlice actual;

            actual = TimeSlice.StartTimeSlice <T>(processPriority, delayTimeSpan, intervalTimeSpan, iCount, timerStateCallback, tState);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("验证此测试方法的正确性。");
        }
コード例 #11
0
ファイル: NetState.cs プロジェクト: indangerofcollapsing/wow
        /// <summary>
        /// 清理当前的网络数据,并断开连接
        /// </summary>
        /// <param name="bFlush"></param>
        public void Dispose(bool bFlush, long iSeconds)
        {
            // 防止多线程时多次调用Dispose(...)有问题
            if (m_Disposed.SetInvalid() == false)
            {
                return;
            }

            if (bFlush == true)
            {
                this.Flush();

                TimeSlice.StartTimeSlice(TimeSpan.FromSeconds(iSeconds), new TimeSliceCallback(this.InsideDispose));
            }
            else
            {
                this.InsideDispose();
            }
        }
コード例 #12
0
        /// <summary>
        /// 清理当前的网络数据,并断开连接
        /// </summary>
        /// <param name="bFlush"></param>
        public void Dispose(bool bFlush, long waitSeconds)
        {
            // 防止多线程时多次调用Dispose(...)有问题
            if (m_Disposed.SetInvalid() == false)
            {
                return;
            }

            if (bFlush == true)
            {
                Flush();

                TimeSlice.StartTimeSlice(TimeSpan.FromSeconds(waitSeconds), InsideDispose);
            }
            else
            {
                InsideDispose();
            }
        }
コード例 #13
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        public void InitMap(object sender, MapEventArgs eventArgs)
        {
            eventArgs.Map.MapRectangle = new Rectangle3D(-17067.0f, -17067.0f, -17067.0f, 17067.0f, 17067.0f, 17067.0f);

            m_CheckDeactivateSlice = TimeSlice.StartTimeSlice(m_CheckDeactivateTimeSpan, m_CheckDeactivateTimeSpan, new TimeSliceCallback(this.CheckDeactivateSpaceNode));
        }
コード例 #14
0
ファイル: MessagePump.cs プロジェクト: zaq1xsw/DogSE
        /// <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();
            }
        }
コード例 #15
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);
                    }
                }
            }
        }
コード例 #16
0
 /// <summary>
 /// 地图点激活
 /// </summary>
 public virtual void OnSpaceNodeActivate()
 {
     m_SpaceNodeActivateTimeSlice = TimeSlice.StartTimeSlice(TimeSpan.FromMilliseconds(1000), SpaceNodeActivateCallback);
 }