/// <summary> /// Palyer Timer工作 /// </summary> /// <param name="cancelToken">控制取消对象</param> /// <returns></returns> private async Task PlayerCtxTimerWorkerProc(CancellationToken cancelToken) { // 检查工作状态 if (1 != m_state) { return; } try { //Int64 currentTimeTick = 0; // 没有收到取消请求时 while (!cancelToken.IsCancellationRequested) { //// 获取开始时间毫秒 //currentTimeTick = DateTime.Now.Ticks; //// 用当前时间秒查询循环容器 //IEnumerable<KeyValuePair<Int64, PlayerTimerNode>> query = // m_playerCtxTimers.Where(timer => timer.Value.m_nextCallTime <= currentTimeTick); // 有满足条件的作timer call处理以及删除 foreach (KeyValuePair <Int64, PlayerTimerNode> timerPair in GetTriggerableTimerNodeList()) { // 先删除 PlayerTimerNode playerTimer = null; m_playerCtxTimers.TryRemove(timerPair.Key, out playerTimer); if (playerTimer == null) { continue; } // 查找目标playerctx IManagedContext playerCtx = m_playerCtxManager.FindPlayerContextBySid(playerTimer.m_playerSid); if (playerCtx == null) { continue; } // 发送msg PlayerTimerMessage message = new PlayerTimerMessage(playerTimer.m_int32Data, playerTimer.m_int64Data, playerTimer.m_objData); playerCtx.PostLocalMessage(message); } // 每500毫秒轮询一次 await Task.Delay(500); } Log.Debug("TimerManager::PlayerCtxTimerWorkerProc stop"); } catch (Exception ex) { Log.Debug("TimerManager::PlayerCtxTimerWorkerProc catch Execption: " + ex.ToString()); } }
/// <summary> /// 玩家现场timer回调 /// </summary> /// <param name="msg"></param> /// <returns></returns> protected virtual Task OnPlayerContextTimer(PlayerTimerMessage msg) { if (msg == null) { Log.Error("PlayerContextBase::OnPlayerContextTimer, but lmsg checked failed"); return(Task.CompletedTask); } Log.Debug("PlayerContextBase::OnPlayerContextTimer, MessageId = " + msg.MessageId.ToString()); return(Task.CompletedTask); }
/// <summary> /// 消息都走这里,从网络来的消息 或者是内部产生的消息 都走这里 /// </summary> /// <param name="msg"></param> /// <returns></returns> public virtual async Task OnMessage(ILocalMessage msg) { //在这里将处理一系列消息 switch (msg.MessageId) { //AsyncAction消息的回调 case ServerBaseLocalMesssageIDDef.LocalMsgAsyncActionResult: ContextAsyncAction contextAsyncAction = msg as ContextAsyncAction; contextAsyncAction.OnResultInternal(); //执行回调 break; case ServerBaseLocalMesssageIDDef.NetMessage: //如何是网络消息就通过分发器进行分发 NetClientMessage message = msg as NetClientMessage; MessageDispather.Instance.Handle(this, message.MessageInfo); //在这里将消息进行分发 直接调用逻辑handler break; case ServerBaseLocalMesssageIDDef.RpcNetMessage: RpcNetClientMessage rpcmessage = msg as RpcNetClientMessage; var response = (IResponse)rpcmessage.MessageInfo.Message; if (response == null) { throw new Exception($"flag is response, but message is not! {rpcmessage.MessageInfo.Opcode}"); } Action <IResponse> action; if (!m_requestCallback.TryGetValue(response.RpcId, out action)) { return; } m_requestCallback.Remove(response.RpcId); action(response); //这里处理逻辑 返回await break; case ServerBaseLocalMesssageIDDef.LocalMsgPlayCtxTimer: //现场计时任务回调感知 { PlayerTimerMessage timerMsg = msg as PlayerTimerMessage; await OnPlayerContextTimer(timerMsg); return; } case ServerBaseLocalMesssageIDDef.SystemSendNetMessage: var snm = (SystemSendNetMessage)msg; if (snm.Message == null) { Log.Debug("要发送的网络消息为空"); return; } //Log.Info("系统向玩家发送消息 " + snm.PlayerId + " " + snm.Message.GetType()); //S2C_SyncLevelStateBattleMessage syncLevelStateBattleMessage = snm.Message as S2C_SyncLevelStateBattleMessage; //if (syncLevelStateBattleMessage != null) //{ // Log.Info("服务器转发延迟 = "+(DateTime.Now.Ticks - syncLevelStateBattleMessage.Time)/10000); //} Send(snm.Message); break; default: break; } //本地消息和网络消息分开 //收到的如果是网络消息就通过分发器进行分发 分发器由ServerBase维护 //收到的是本地消息就在本地进行处理 return; }