private static async Task RunTask(this ActorLocationSender self, ActorTask task) { ActorMessageSender actorMessageSender = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(self.ActorId); IActorResponse response = await actorMessageSender.Call(task.ActorRequest); // 发送成功 switch (response.Error) { case ErrorCode.ERR_NotFoundActor: // 如果没找到Actor,重试 ++self.FailTimes; // 失败MaxFailTimes次则清空actor发送队列,返回失败 if (self.FailTimes > ActorLocationSender.MaxFailTimes) { // 失败直接删除actorproxy Log.Info($"actor send message fail, actorid: {self.Id}"); self.RunError(response.Error); self.GetParent <ActorLocationSenderComponent>().Remove(self.Id); return; } // 等待0.5s再发送 await Game.Scene.GetComponent <TimerComponent>().WaitAsync(500); self.ActorId = await Game.Scene.GetComponent <LocationProxyComponent>().Get(self.Id); self.Address = StartConfigComponent.Instance .Get(IdGenerater.GetAppIdFromId(self.ActorId)) .GetComponent <InnerConfig>().IPEndPoint; self.AllowGet(); return; case ErrorCode.ERR_ActorNoMailBoxComponent: self.RunError(response.Error); self.GetParent <ActorLocationSenderComponent>().Remove(self.Id); return; default: self.LastSendTime = TimeHelper.Now(); self.FailTimes = 0; self.WaitingTasks.Dequeue(); if (task.Tcs == null) { return; } IActorLocationResponse actorLocationResponse = response as IActorLocationResponse; if (actorLocationResponse == null) { task.Tcs.SetException(new Exception($"actor location respose is not IActorLocationResponse, but is: {response.GetType().Name}")); } task.Tcs.SetResult(actorLocationResponse); return; } }
private static async ETTask RunTask(this ActorLocationSender self, ActorTask task) { ActorMessageSender actorMessageSender = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(self.ActorId); IActorResponse response = await actorMessageSender.Call(task.ActorRequest); // 发送成功 switch (response.Error) { case ErrorCode.ERR_NotFoundActor: // 如果没找到Actor,重试 ++self.FailTimes; // 失败MaxFailTimes次则清空actor发送队列,返回失败 if (self.FailTimes > ActorLocationSender.MaxFailTimes) { // 失败直接删除actorproxy Log.Info($"actor send message fail, actorid: {self.Id}"); self.RunError(response.Error); self.GetParent <ActorLocationSenderComponent>().Remove(self.Id); return; } // 等待0.5s再发送 await Game.Scene.GetComponent <TimerComponent>().WaitAsync(500); self.ActorId = await Game.Scene.GetComponent <LocationProxyComponent>().Get(self.Id); self.AllowGet(); return; case ErrorCode.ERR_ActorNoMailBoxComponent: self.RunError(response.Error); self.GetParent <ActorLocationSenderComponent>().Remove(self.Id); return; default: self.LastRecvTime = TimeHelper.Now(); self.FailTimes = 0; self.WaitingTasks.Dequeue(); // 如果所有的发送消息都得到了返回,发送任务完成,那么删除这个ActorLocationSender,及时回收发送对象 if (self.WaitingTasks.Count == 0) { self.GetParent <ActorLocationSenderComponent>().Remove(self.Id); } if (task.Tcs != null) { IActorLocationResponse actorLocationResponse = response as IActorLocationResponse; if (actorLocationResponse == null) { task.Tcs.SetException(new Exception($"actor location respose is not IActorLocationResponse, but is: {response.GetType().Name}")); } task.Tcs.SetResult(actorLocationResponse); } return; } }