public static async void UpdateAsync(this ActorMessageSender self) { try { while (true) { ActorTask actorTask = await self.GetAsync(); if (self.IsDisposed) { return; } if (actorTask.ActorMessage == null) { return; } await self.RunTask(actorTask); } } catch (Exception e) { Log.Error(e); } }
public static async void UpdateAsync(this ActorLocationSender self) { try { long instanceId = self.InstanceId; while (true) { if (self.InstanceId != instanceId) { return; } ActorTask actorTask = await self.GetAsync(); if (self.InstanceId != instanceId) { return; } if (actorTask.ActorRequest == null) { return; } await self.RunTask(actorTask); } } catch (Exception e) { Log.Error(e); } }
/// <summary> /// 处理发送消息 /// </summary> /// <param name="self"></param> /// <param name="task"></param> /// <returns></returns> private static async Task RunTask(this ActorLocationSender self, ActorTask task) { //获得和其他服务器通讯的会话 ActorMessageSender actorMessageSender = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(self.ActorId); //发送一个rpc消息 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); //重新获得map服务器地址 self.Address = StartConfigComponent.Instance .Get(IdGenerater.GetAppIdFromId(self.ActorId)) .GetComponent <InnerConfig>().IPEndPoint; //得到IP 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); //返回PRC消息回应 return; } }
public override ActorTask GetTask(Actor entity) { ActorTask tmp = PendingTask; PendingTask = null; return(tmp); }
public static Task <IResponse> Call(this ActorMessageSender self, IActorRequest request) { TaskCompletionSource <IResponse> tcs = new TaskCompletionSource <IResponse>(); ActorTask task = new ActorTask(request, tcs); self.Add(task); return(task.Tcs.Task); }
public static void Send(this ActorProxy self, IActorMessage message) { ActorTask task = new ActorTask { message = message, proxy = self }; self.Add(task); }
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; } }
public static Task <IResponse> Call(this ActorProxy self, IActorRequest request) { ActorTask task = new ActorTask { message = request, proxy = self, Tcs = new TaskCompletionSource <IResponse>() }; self.Add(task); return(task.Tcs.Task); }
private void DoParser(IActor anActor) { List <String> aList = new List <String>(); aList.Add(ActorTask.Stat()); var lParser = new ParserActor(); lParser.SendMessage(aList.AsEnumerable <String>(), anActor); }
public static void RunError(this ActorLocationSender self, int errorCode) { while (self.WaitingTasks.Count > 0) { ActorTask actorTask = self.WaitingTasks.Dequeue(); actorTask.Tcs?.SetException(new RpcException(errorCode, "")); } self.WaitingTasks.Clear(); }
private void SettingEvent() { ServiceManager.EventService.GameObjectClick += (data) => { if (data.MouseButton == MouseButton.Rigth) { PendingTask = Task.Create <ActorTaskMoveTo>().Assign(data.ClickPoint); } }; }
private static async Task RunTask(this ActorMessageSender self, ActorTask task) { Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(null); //Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(self.Address); task.ActorMessage.ActorId = self.ActorId; IResponse response = await session.Call(task.ActorMessage); Log.Debug("runTask:" + task.ActorMessage.GetType().FullName); Log.Debug("runTask1:" + response.Tag); // 发送成功 switch (response.Tag) { case ErrorCode.ERR_NotFoundActor: // 如果没找到Actor,重试 ++self.FailTimes; // 失败MaxFailTimes次则清空actor发送队列,返回失败 if (self.FailTimes > self.MaxFailTimes) { // 失败直接删除actorproxy Log.Info($"actor send message fail, actorid: {self.Id}"); self.Error = response.Tag; self.GetParent <ActorMessageSenderComponent>().Remove(self.Id); return; } // 等待1s再发送 await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000); //self.ActorId = await Game.Scene.GetComponent<LocationProxyComponent>().Get(self.Id); //self.Address = Game.Scene.GetComponent<StartConfigComponent>() // .Get(IdGenerater.GetAppIdFromId(self.ActorId)) // .GetComponent<InnerConfig>().IPEndPoint; self.AllowGet(); return; case ErrorCode.ERR_ActorNoMailBoxComponent: self.Error = response.Tag; self.GetParent <ActorMessageSenderComponent>().Remove(self.Id); return; default: self.LastSendTime = TimeHelper.Now(); self.FailTimes = 0; self.WaitingTasks.Dequeue(); task.Tcs?.SetResult(response); return; } }
public static void Send(this ActorMessageSender self, IActorMessage message) { if (message == null) { throw new Exception($"actor send message is null"); } ActorTask task = new ActorTask(message); self.Add(task); }
private void DoParser() { List <String> aList = new List <String>(); aList.Add(ActorTask.Stat()); var lParser = new ParserActor(); new EchoActor <IEnumerable <string> >(lParser, aList); lParser.SendMessage(aList.AsEnumerable <String>()); }
public static void Send(this ActorLocationSender self, IActorLocationMessage request) { if (request == null) { throw new Exception($"actor location send message is null"); } ActorTask task = new ActorTask(request); self.Add(task); }
public override void Process(Task task) { base.Process(task); ActorTask actorTask = task as ActorTask; if (actorTask != null) { SetTask(actorTask); } }
/// <summary> /// 从队列里面取出一个消息进行处理 /// </summary> /// <param name="self"></param> /// <returns></returns> private static Task <ActorTask> GetAsync(this ActorLocationSender self) { if (self.WaitingTasks.Count > 0) { ActorTask task = self.WaitingTasks.Peek(); return(Task.FromResult(task)); //创建一个带返回值的、已完成的异步任务,其参数是取出的Task。 } self.Tcs = new TaskCompletionSource <ActorTask>(); //如果棧里面有消息 这里是不会执行的,只有当站里面没有消息,程序就会在这里等待 知道加入了新的消息 继续 return(self.Tcs.Task); //检测当前是否可以取堆栈里面缓存的消息 }
private static Task <ActorTask> GetAsync(this ActorLocationSender self) { if (self.WaitingTasks.Count > 0) { ActorTask task = self.WaitingTasks.Peek(); return(Task.FromResult(task)); } self.Tcs = new TaskCompletionSource <ActorTask>(); return(self.Tcs.Task); }
public static Task <IActorLocationResponse> Call(this ActorLocationSender self, IActorLocationRequest request) { if (request == null) { throw new Exception($"actor location call message is null"); } TaskCompletionSource <IActorLocationResponse> tcs = new TaskCompletionSource <IActorLocationResponse>(); ActorTask task = new ActorTask(request, tcs); self.Add(task); return(task.Tcs.Task); }
private void Behavior(IActor msg) { // get number of actor in directory StringBuilder sb = new StringBuilder(); sb.AppendLine(DirectoryActor.GetDirectory().Stat()); // get number of actor in queue list sb.AppendLine(ActorTask.Stat()); // get number of actor in hostdirectory sb.AppendLine(HostDirectoryActor.GetInstance().GetStat()); msg.SendMessage(sb.ToString()); Become(new NullBehaviors()); }
private static void AllowGet(this ActorLocationSender self) { if (self.Tcs == null || self.WaitingTasks.Count <= 0) { return; } ActorTask task = self.WaitingTasks.Peek(); var t = self.Tcs; self.Tcs = null; t.SetResult(task); }
private static void Add(this ActorLocationSender self, ActorTask task) { if (self.IsDisposed) { throw new Exception("ActorLocationSender Disposed! dont hold ActorMessageSender"); } self.WaitingTasks.Enqueue(task); // failtimes > 0表示正在重试,这时候不能加到正在发送队列 if (self.FailTimes == 0) { self.AllowGet(); } }
public override void Destroy(ActorMessageSender self) { while (self.WaitingTasks.Count > 0) { ActorTask actorTask = self.WaitingTasks.Dequeue(); actorTask.Tcs?.SetException(new RpcException(self.Error, "")); } self.LastSendTime = 0; self.Address = null; self.ActorId = 0; self.FailTimes = 0; self.Tcs = null; }
private static void Add(this ActorProxy self, ActorTask task) { if (self.IsDisposed) { throw new Exception("ActorProxy Disposed! dont hold actorproxy"); } self.WaitingTasks.Enqueue(task); // failtimes > 0表示正在重试,这时候不能加到正在发送队列 if (self.FailTimes == 0) { self.AllowGet(); } }
/// <summary> /// /检测当前是否可以取堆栈里面缓存的消息 /// </summary> /// <param name="self"></param> private static void AllowGet(this ActorLocationSender self) { ///没有缓存消息 跳出 表示不可以取棧里数据 if (self.Tcs == null || self.WaitingTasks.Count <= 0) { return; } ActorTask task = self.WaitingTasks.Peek(); //取出第一个 但不移除 var t = self.Tcs; self.Tcs = null; t.SetResult(task); //设置了值 说明可以取了 }
public override void Destroy(ActorProxy self) { self.LastSendTime = 0; self.Address = null; while (self.WaitingTasks.Count > 0) { ActorTask actorTask = self.WaitingTasks.Dequeue(); actorTask.RunFail(ErrorCode.ERR_NotFoundActor); } self.failTimes = 0; var t = self.tcs; self.tcs = null; t?.SetResult(new ActorTask()); }
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(); task.Tcs?.SetResult(response); return; } }
protected override void OnValidate() { base.OnValidate(); if (TaskProvider != null) { TaskProvider = TaskProvider.ScriptClone(); } if (Task != null) { Task = Task.ScriptClone(); } if (Command != null) { Command = Command.ScriptClone(); } }
private static async Task RunTask(this ActorProxy self, ActorTask task) { try { IResponse response = await task.Run(); // 如果没找到Actor,重试 if (response.Error == ErrorCode.ERR_NotFoundActor) { ++self.FailTimes; // 失败10次则清空actor发送队列,返回失败 if (self.FailTimes > self.MaxFailTimes) { // 失败直接删除actorproxy Log.Info($"actor send message fail, actorid: {self.Id}"); Game.Scene.GetComponent <ActorProxyComponent>().Remove(self.Id); return; } // 等待1s再发送 await Game.Scene.GetComponent <TimerComponent>().WaitAsync(1000); self.ActorId = await Game.Scene.GetComponent <LocationProxyComponent>().Get(self.Id); self.Address = Game.Scene.GetComponent <StartConfigComponent>() .Get(IdGenerater.GetAppIdFromId(self.ActorId)) .GetComponent <InnerConfig>().IPEndPoint; self.AllowGet(); return; } // 发送成功 self.LastSendTime = TimeHelper.Now(); self.FailTimes = 0; self.WaitingTasks.Dequeue(); } catch (Exception e) { Log.Error(e); } }
protected override void Update() { if (CurrentTask == null || CurrentTask.State == eTaskState.Completed) { CurrentTask = GetTarget(); if (CurrentTask != null) { NavMeshAgent.SetDestination(CurrentTask.Target.position); } } if (TalkingTask == null || TalkingTask.State == eTaskState.Completed) { TalkingTask = GetTalkTask(); } SpeechBubble.SetTalking(TalkingTask != null); UpdateVisuals(); base.Update(); }