Bläddra i källkod

Mailbox协程锁放到Mailbox的方法中

tanghai 6 år sedan
förälder
incheckning
de58c83425

+ 17 - 14
Server/Hotfix/Module/Actor/MailBoxComponentSystem.cs

@@ -25,21 +25,24 @@ namespace ETHotfix
 	{
 		public static async ETTask Handle(this MailBoxComponent self, Session session, IActorMessage message)
 		{
-			switch (self.MailboxType)
+			using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, message.ActorId))
 			{
-				case MailboxType.GateSession:
-					IActorMessage iActorMessage = message as IActorMessage;
-					// 发送给客户端
-					Session clientSession = self.Parent as Session;
-					iActorMessage.ActorId = 0;
-					clientSession.Send(iActorMessage);
-					break;
-				case MailboxType.MessageDispatcher:
-					await ActorMessageDispatcherComponent.Instance.Handle(self.Parent, session, message);
-					break;
-				case MailboxType.UnOrderMessageDispatcher:
-					self.HandleInner(session, message).Coroutine();
-					break;
+				switch (self.MailboxType)
+				{
+					case MailboxType.GateSession:
+						IActorMessage iActorMessage = message as IActorMessage;
+						// 发送给客户端
+						Session clientSession = self.Parent as Session;
+						iActorMessage.ActorId = 0;
+						clientSession.Send(iActorMessage);
+						break;
+					case MailboxType.MessageDispatcher:
+						await ActorMessageDispatcherComponent.Instance.Handle(self.Parent, session, message);
+						break;
+					case MailboxType.UnOrderMessageDispatcher:
+						self.HandleInner(session, message).Coroutine();
+						break;
+				}
 			}
 		}
 

+ 39 - 43
Server/Hotfix/Module/Message/InnerMessageDispatcherHelper.cs

@@ -13,63 +13,59 @@
 		{
 			long replyId = IdGenerater.GetProcessId(iActorRequest.ActorId);
 			iActorRequest.ActorId = iActorRequest.ActorId & IdGenerater.HeadMask | IdGenerater.Head;
-			using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, iActorRequest.ActorId))
+
+			string address = StartConfigComponent.Instance.GetProcessInnerAddress(replyId);
+			Session ss = NetInnerComponent.Instance.Get(address);
+			Entity entity = Game.EventSystem.Get(iActorRequest.ActorId);
+			if (entity == null)
 			{
-				string address = StartConfigComponent.Instance.GetProcessInnerAddress(replyId);
-				Session ss = NetInnerComponent.Instance.Get(address);
-				Entity entity = Game.EventSystem.Get(iActorRequest.ActorId);
-				if (entity == null)
+				Log.Warning($"not found actor: {MongoHelper.ToJson(iActorRequest)}");
+				ActorResponse response = new ActorResponse
 				{
-					Log.Warning($"not found actor: {MongoHelper.ToJson(iActorRequest)}");
-					ActorResponse response = new ActorResponse
-					{
-						Error = ErrorCode.ERR_NotFoundActor,
-						RpcId = iActorRequest.RpcId,
-					};
-					ss.Reply(response);
-					return;
-				}
+					Error = ErrorCode.ERR_NotFoundActor,
+					RpcId = iActorRequest.RpcId,
+				};
+				ss.Reply(response);
+				return;
+			}
 	
-				MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
-				if (mailBoxComponent == null)
+			MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
+			if (mailBoxComponent == null)
+			{
+				ActorResponse response = new ActorResponse
 				{
-					ActorResponse response = new ActorResponse
-					{
-						Error = ErrorCode.ERR_ActorNoMailBoxComponent,
-						RpcId = iActorRequest.RpcId,
-					};
-					ss.Reply(response);
-					Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {iActorRequest}");
-					return;
-				}
-				
-				await mailBoxComponent.Handle(ss, iActorRequest);
+					Error = ErrorCode.ERR_ActorNoMailBoxComponent,
+					RpcId = iActorRequest.RpcId,
+				};
+				ss.Reply(response);
+				Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {iActorRequest}");
+				return;
 			}
+			
+			await mailBoxComponent.Handle(ss, iActorRequest);
 		}
 
 		public static async ETVoid HandleIActorMessage(Session session, IActorMessage iActorMessage)
 		{
 			long replyId = IdGenerater.GetProcessId(iActorMessage.ActorId);
 			iActorMessage.ActorId = iActorMessage.ActorId & IdGenerater.HeadMask | IdGenerater.Head;
-			using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, iActorMessage.ActorId))
+			
+			Entity entity = Game.EventSystem.Get(iActorMessage.ActorId);
+			if (entity == null)
 			{
-				Entity entity = Game.EventSystem.Get(iActorMessage.ActorId);
-				if (entity == null)
-				{
-					Log.Error($"not found actor: {MongoHelper.ToJson(iActorMessage)}");
-					return;
-				}
+				Log.Error($"not found actor: {MongoHelper.ToJson(iActorMessage)}");
+				return;
+			}
 	
-				MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
-				if (mailBoxComponent == null)
-				{
-					Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {iActorMessage}");
-					return;
-				}
-				
-				Session ss = NetInnerComponent.Instance.Get(replyId);
-				await mailBoxComponent.Handle(ss, iActorMessage);
+			MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
+			if (mailBoxComponent == null)
+			{
+				Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {iActorMessage}");
+				return;
 			}
+			
+			Session ss = NetInnerComponent.Instance.Get(replyId);
+			await mailBoxComponent.Handle(ss, iActorMessage);
 		}
     }
 }