Răsfoiți Sursa

1.修复多进程转发消息rpcId未还原的bug
2.对象池的Request消息的生命周期延长到Call结束

tanghai 2 ani în urmă
părinte
comite
74a89a75d5
24 a modificat fișierele cu 160 adăugiri și 74 ștergeri
  1. BIN
      Config/Excel/cs/StartConfig/Release/StartProcessConfigCategory.bytes
  2. BIN
      Config/Excel/cs/StartConfig/Release/StartSceneConfigCategory.bytes
  3. BIN
      Config/Excel/cs/StartConfig/Release/StartZoneConfigCategory.bytes
  4. BIN
      Config/Excel/s/StartConfig/Release/StartProcessConfigCategory.bytes
  5. BIN
      Config/Excel/s/StartConfig/Release/StartSceneConfigCategory.bytes
  6. BIN
      Config/Excel/s/StartConfig/Release/StartZoneConfigCategory.bytes
  7. 10 1
      Config/Json/cs/StartConfig/Release/StartProcessConfig.txt
  8. 11 11
      Config/Json/cs/StartConfig/Release/StartSceneConfig.txt
  9. 2 1
      Config/Json/cs/StartConfig/Release/StartZoneConfig.txt
  10. 10 1
      Config/Json/s/StartConfig/Release/StartProcessConfig.txt
  11. 11 11
      Config/Json/s/StartConfig/Release/StartSceneConfig.txt
  12. 2 1
      Config/Json/s/StartConfig/Release/StartZoneConfig.txt
  13. BIN
      Unity/Assets/Config/Excel/StartConfig/Release/StartMachineConfig@s.xlsx
  14. BIN
      Unity/Assets/Config/Excel/StartConfig/Release/StartProcessConfig@s.xlsx
  15. BIN
      Unity/Assets/Config/Excel/StartConfig/Release/StartSceneConfig@s.xlsx
  16. BIN
      Unity/Assets/Config/Excel/StartConfig/Release/StartZoneConfig@s.xlsx
  17. 29 3
      Unity/Assets/Scripts/Core/Fiber/Module/Actor/MessageSenderStruct.cs
  18. 8 7
      Unity/Assets/Scripts/Core/Fiber/Module/Actor/ProcessInnerSenderSystem.cs
  19. 4 1
      Unity/Assets/Scripts/Hotfix/Client/Demo/NetClient/A2NetClient_RequestHandler.cs
  20. 7 8
      Unity/Assets/Scripts/Hotfix/Client/Demo/NetClient/Ping/PingComponentSystem.cs
  21. 4 1
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_RequestHandler.cs
  22. 3 2
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/MessageSenderSystem.cs
  23. 19 14
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/ProcessOuterSenderSystem.cs
  24. 40 12
      Unity/Assets/Scripts/Model/Share/Module/Message/Session.cs

BIN
Config/Excel/cs/StartConfig/Release/StartProcessConfigCategory.bytes


BIN
Config/Excel/cs/StartConfig/Release/StartSceneConfigCategory.bytes


BIN
Config/Excel/cs/StartConfig/Release/StartZoneConfigCategory.bytes


BIN
Config/Excel/s/StartConfig/Release/StartProcessConfigCategory.bytes


BIN
Config/Excel/s/StartConfig/Release/StartSceneConfigCategory.bytes


BIN
Config/Excel/s/StartConfig/Release/StartZoneConfigCategory.bytes


+ 10 - 1
Config/Json/cs/StartConfig/Release/StartProcessConfig.txt

@@ -1,5 +1,14 @@
 {"dict": [
 [1, {"_t":"StartProcessConfig","_id":1,"MachineId":1,"Port":20001}],
 [2, {"_t":"StartProcessConfig","_id":2,"MachineId":1,"Port":20002}],
-[3, {"_t":"StartProcessConfig","_id":3,"MachineId":1,"Port":0}],
+[3, {"_t":"StartProcessConfig","_id":3,"MachineId":1,"Port":20003}],
+[4, {"_t":"StartProcessConfig","_id":4,"MachineId":1,"Port":20004}],
+[5, {"_t":"StartProcessConfig","_id":5,"MachineId":1,"Port":20005}],
+[6, {"_t":"StartProcessConfig","_id":6,"MachineId":1,"Port":20006}],
+[7, {"_t":"StartProcessConfig","_id":7,"MachineId":1,"Port":20007}],
+[8, {"_t":"StartProcessConfig","_id":8,"MachineId":1,"Port":20008}],
+[9, {"_t":"StartProcessConfig","_id":9,"MachineId":1,"Port":20009}],
+[10, {"_t":"StartProcessConfig","_id":10,"MachineId":1,"Port":20010}],
+[11, {"_t":"StartProcessConfig","_id":11,"MachineId":1,"Port":20011}],
+[12, {"_t":"StartProcessConfig","_id":12,"MachineId":1,"Port":20012}],
 ]}

+ 11 - 11
Config/Json/cs/StartConfig/Release/StartSceneConfig.txt

@@ -1,14 +1,14 @@
 {"dict": [
 [1, {"_t":"StartSceneConfig","_id":1,"Process":1,"Zone":1,"SceneType":"Realm","Name":"Realm","Port":30002}],
-[2, {"_t":"StartSceneConfig","_id":2,"Process":1,"Zone":1,"SceneType":"Gate","Name":"Gate1","Port":30003}],
-[3, {"_t":"StartSceneConfig","_id":3,"Process":1,"Zone":1,"SceneType":"Gate","Name":"Gate2","Port":30004}],
-[11, {"_t":"StartSceneConfig","_id":11,"Process":2,"Zone":1,"SceneType":"Location","Name":"Location","Port":0}],
-[12, {"_t":"StartSceneConfig","_id":12,"Process":2,"Zone":1,"SceneType":"Map","Name":"Map1","Port":0}],
-[13, {"_t":"StartSceneConfig","_id":13,"Process":2,"Zone":1,"SceneType":"Map","Name":"Map2","Port":0}],
-[14, {"_t":"StartSceneConfig","_id":14,"Process":2,"Zone":1,"SceneType":"Match","Name":"Match","Port":0}],
-[30, {"_t":"StartSceneConfig","_id":30,"Process":3,"Zone":3,"SceneType":"RouterManager","Name":"RouterManager","Port":30300}],
-[31, {"_t":"StartSceneConfig","_id":31,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router01","Port":30301}],
-[32, {"_t":"StartSceneConfig","_id":32,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router02","Port":30302}],
-[33, {"_t":"StartSceneConfig","_id":33,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router03","Port":30303}],
-[34, {"_t":"StartSceneConfig","_id":34,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router04","Port":30304}],
+[2, {"_t":"StartSceneConfig","_id":2,"Process":2,"Zone":1,"SceneType":"Gate","Name":"Gate1","Port":30003}],
+[3, {"_t":"StartSceneConfig","_id":3,"Process":3,"Zone":1,"SceneType":"Gate","Name":"Gate2","Port":30004}],
+[4, {"_t":"StartSceneConfig","_id":4,"Process":4,"Zone":1,"SceneType":"Location","Name":"Location","Port":0}],
+[5, {"_t":"StartSceneConfig","_id":5,"Process":5,"Zone":1,"SceneType":"Match","Name":"Match","Port":0}],
+[6, {"_t":"StartSceneConfig","_id":6,"Process":6,"Zone":1,"SceneType":"Map","Name":"Map1","Port":0}],
+[7, {"_t":"StartSceneConfig","_id":7,"Process":7,"Zone":1,"SceneType":"Map","Name":"Map2","Port":0}],
+[300, {"_t":"StartSceneConfig","_id":300,"Process":8,"Zone":3,"SceneType":"RouterManager","Name":"RouterManager","Port":30300}],
+[301, {"_t":"StartSceneConfig","_id":301,"Process":9,"Zone":3,"SceneType":"Router","Name":"Router01","Port":30301}],
+[302, {"_t":"StartSceneConfig","_id":302,"Process":10,"Zone":3,"SceneType":"Router","Name":"Router02","Port":30302}],
+[303, {"_t":"StartSceneConfig","_id":303,"Process":11,"Zone":3,"SceneType":"Router","Name":"Router03","Port":30303}],
+[304, {"_t":"StartSceneConfig","_id":304,"Process":12,"Zone":3,"SceneType":"Router","Name":"Router04","Port":30304}],
 ]}

+ 2 - 1
Config/Json/cs/StartConfig/Release/StartZoneConfig.txt

@@ -1,4 +1,5 @@
 {"dict": [
 [1, {"_t":"StartZoneConfig","_id":1,"DBConnection":"mongodb://127.0.0.1","DBName":"ET1"}],
-[2, {"_t":"StartZoneConfig","_id":2,"DBConnection":"mongodb://127.0.0.1","DBName":"ET2"}],
+[2, {"_t":"StartZoneConfig","_id":2,"DBConnection":"","DBName":""}],
+[3, {"_t":"StartZoneConfig","_id":3,"DBConnection":"","DBName":""}],
 ]}

+ 10 - 1
Config/Json/s/StartConfig/Release/StartProcessConfig.txt

@@ -1,5 +1,14 @@
 {"dict": [
 [1, {"_t":"StartProcessConfig","_id":1,"MachineId":1,"Port":20001}],
 [2, {"_t":"StartProcessConfig","_id":2,"MachineId":1,"Port":20002}],
-[3, {"_t":"StartProcessConfig","_id":3,"MachineId":1,"Port":0}],
+[3, {"_t":"StartProcessConfig","_id":3,"MachineId":1,"Port":20003}],
+[4, {"_t":"StartProcessConfig","_id":4,"MachineId":1,"Port":20004}],
+[5, {"_t":"StartProcessConfig","_id":5,"MachineId":1,"Port":20005}],
+[6, {"_t":"StartProcessConfig","_id":6,"MachineId":1,"Port":20006}],
+[7, {"_t":"StartProcessConfig","_id":7,"MachineId":1,"Port":20007}],
+[8, {"_t":"StartProcessConfig","_id":8,"MachineId":1,"Port":20008}],
+[9, {"_t":"StartProcessConfig","_id":9,"MachineId":1,"Port":20009}],
+[10, {"_t":"StartProcessConfig","_id":10,"MachineId":1,"Port":20010}],
+[11, {"_t":"StartProcessConfig","_id":11,"MachineId":1,"Port":20011}],
+[12, {"_t":"StartProcessConfig","_id":12,"MachineId":1,"Port":20012}],
 ]}

+ 11 - 11
Config/Json/s/StartConfig/Release/StartSceneConfig.txt

@@ -1,14 +1,14 @@
 {"dict": [
 [1, {"_t":"StartSceneConfig","_id":1,"Process":1,"Zone":1,"SceneType":"Realm","Name":"Realm","Port":30002}],
-[2, {"_t":"StartSceneConfig","_id":2,"Process":1,"Zone":1,"SceneType":"Gate","Name":"Gate1","Port":30003}],
-[3, {"_t":"StartSceneConfig","_id":3,"Process":1,"Zone":1,"SceneType":"Gate","Name":"Gate2","Port":30004}],
-[11, {"_t":"StartSceneConfig","_id":11,"Process":2,"Zone":1,"SceneType":"Location","Name":"Location","Port":0}],
-[12, {"_t":"StartSceneConfig","_id":12,"Process":2,"Zone":1,"SceneType":"Map","Name":"Map1","Port":0}],
-[13, {"_t":"StartSceneConfig","_id":13,"Process":2,"Zone":1,"SceneType":"Map","Name":"Map2","Port":0}],
-[14, {"_t":"StartSceneConfig","_id":14,"Process":2,"Zone":1,"SceneType":"Match","Name":"Match","Port":0}],
-[30, {"_t":"StartSceneConfig","_id":30,"Process":3,"Zone":3,"SceneType":"RouterManager","Name":"RouterManager","Port":30300}],
-[31, {"_t":"StartSceneConfig","_id":31,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router01","Port":30301}],
-[32, {"_t":"StartSceneConfig","_id":32,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router02","Port":30302}],
-[33, {"_t":"StartSceneConfig","_id":33,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router03","Port":30303}],
-[34, {"_t":"StartSceneConfig","_id":34,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router04","Port":30304}],
+[2, {"_t":"StartSceneConfig","_id":2,"Process":2,"Zone":1,"SceneType":"Gate","Name":"Gate1","Port":30003}],
+[3, {"_t":"StartSceneConfig","_id":3,"Process":3,"Zone":1,"SceneType":"Gate","Name":"Gate2","Port":30004}],
+[4, {"_t":"StartSceneConfig","_id":4,"Process":4,"Zone":1,"SceneType":"Location","Name":"Location","Port":0}],
+[5, {"_t":"StartSceneConfig","_id":5,"Process":5,"Zone":1,"SceneType":"Match","Name":"Match","Port":0}],
+[6, {"_t":"StartSceneConfig","_id":6,"Process":6,"Zone":1,"SceneType":"Map","Name":"Map1","Port":0}],
+[7, {"_t":"StartSceneConfig","_id":7,"Process":7,"Zone":1,"SceneType":"Map","Name":"Map2","Port":0}],
+[300, {"_t":"StartSceneConfig","_id":300,"Process":8,"Zone":3,"SceneType":"RouterManager","Name":"RouterManager","Port":30300}],
+[301, {"_t":"StartSceneConfig","_id":301,"Process":9,"Zone":3,"SceneType":"Router","Name":"Router01","Port":30301}],
+[302, {"_t":"StartSceneConfig","_id":302,"Process":10,"Zone":3,"SceneType":"Router","Name":"Router02","Port":30302}],
+[303, {"_t":"StartSceneConfig","_id":303,"Process":11,"Zone":3,"SceneType":"Router","Name":"Router03","Port":30303}],
+[304, {"_t":"StartSceneConfig","_id":304,"Process":12,"Zone":3,"SceneType":"Router","Name":"Router04","Port":30304}],
 ]}

+ 2 - 1
Config/Json/s/StartConfig/Release/StartZoneConfig.txt

@@ -1,4 +1,5 @@
 {"dict": [
 [1, {"_t":"StartZoneConfig","_id":1,"DBConnection":"mongodb://127.0.0.1","DBName":"ET1"}],
-[2, {"_t":"StartZoneConfig","_id":2,"DBConnection":"mongodb://127.0.0.1","DBName":"ET2"}],
+[2, {"_t":"StartZoneConfig","_id":2,"DBConnection":"","DBName":""}],
+[3, {"_t":"StartZoneConfig","_id":3,"DBConnection":"","DBName":""}],
 ]}

BIN
Unity/Assets/Config/Excel/StartConfig/Release/StartMachineConfig@s.xlsx


BIN
Unity/Assets/Config/Excel/StartConfig/Release/StartProcessConfig@s.xlsx


BIN
Unity/Assets/Config/Excel/StartConfig/Release/StartSceneConfig@s.xlsx


BIN
Unity/Assets/Config/Excel/StartConfig/Release/StartZoneConfig@s.xlsx


+ 29 - 3
Unity/Assets/Scripts/Core/Fiber/Module/Actor/MessageSenderStruct.cs

@@ -1,4 +1,5 @@
-using System.IO;
+using System;
+using System.IO;
 
 namespace ET
 {
@@ -9,16 +10,41 @@ namespace ET
         
         public IRequest Request { get; }
 
+        private readonly bool IsFromPool;
+
         public bool NeedException { get; }
 
-        public ETTask<IResponse> Tcs { get; }
+        private readonly ETTask<IResponse> tcs;
 
         public MessageSenderStruct(ActorId actorId, IRequest iRequest, ETTask<IResponse> tcs, bool needException)
         {
             this.ActorId = actorId;
+            
             this.Request = iRequest;
-            this.Tcs = tcs;
+            MessageObject messageObject = (MessageObject)this.Request;
+            this.IsFromPool = messageObject.IsFromPool;
+            messageObject.IsFromPool = false;
+            
+            this.tcs = tcs;
             this.NeedException = needException;
         }
+        
+        public void SetResult(IResponse response)
+        {
+            MessageObject messageObject = (MessageObject)this.Request;
+            messageObject.IsFromPool = this.IsFromPool;
+            messageObject.Dispose();
+            
+            this.tcs.SetResult(response);
+        }
+        
+        public void SetException(Exception exception)
+        {
+            MessageObject messageObject = (MessageObject)this.Request;
+            messageObject.IsFromPool = this.IsFromPool;
+            messageObject.Dispose();
+            
+            this.tcs.SetException(exception);
+        }
     }
 }

+ 8 - 7
Unity/Assets/Scripts/Core/Fiber/Module/Actor/ProcessInnerSenderSystem.cs

@@ -74,17 +74,17 @@ namespace ET
         {
             if (response.Error == ErrorCore.ERR_MessageTimeout)
             {
-                self.Tcs.SetException(new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.Request}, response: {response}"));
+                self.SetException(new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.Request}, response: {response}"));
                 return;
             }
 
             if (self.NeedException && ErrorCore.IsRpcNeedThrowException(response.Error))
             {
-                self.Tcs.SetException(new RpcException(response.Error, $"Rpc error: actorId: {self.ActorId} request: {self.Request}, response: {response}"));
+                self.SetException(new RpcException(response.Error, $"Rpc error: actorId: {self.ActorId} request: {self.Request}, response: {response}"));
                 return;
             }
 
-            self.Tcs.SetResult(response);
+            self.SetResult(response);
         }
         
         public static void Reply(this ProcessInnerSender self, Address fromAddress, IResponse message)
@@ -128,14 +128,15 @@ namespace ET
                 bool needException = true
         )
         {
-            request.RpcId = self.GetRpcId();
+            int rpcId = self.GetRpcId();
+            request.RpcId = rpcId;
             
             if (actorId == default)
             {
                 throw new Exception($"actor id is 0: {request}");
             }
 
-            return await self.Call(actorId, request.RpcId, request, needException);
+            return await self.Call(actorId, rpcId, request, needException);
         }
         
         public static async ETTask<IResponse> Call(
@@ -174,12 +175,12 @@ namespace ET
                 
                 if (needException)
                 {
-                    action.Tcs.SetException(new Exception($"actor sender timeout: {iRequest}"));
+                    action.SetException(new Exception($"actor sender timeout: {iRequest}"));
                 }
                 else
                 {
                     IResponse response = MessageHelper.CreateResponse(iRequest, ErrorCore.ERR_Timeout);
-                    action.Tcs.SetResult(response);
+                    action.SetResult(response);
                 }
             }
             

+ 4 - 1
Unity/Assets/Scripts/Hotfix/Client/Demo/NetClient/A2NetClient_RequestHandler.cs

@@ -5,7 +5,10 @@
     {
         protected override async ETTask Run(Scene root, A2NetClient_Request request, A2NetClient_Response response)
         {
-            response.MessageObject = await root.GetComponent<SessionComponent>().Session.Call(request.MessageObject);
+            int rpcId = request.RpcId;
+            IResponse res = await root.GetComponent<SessionComponent>().Session.Call(request.MessageObject);
+            res.RpcId = rpcId;
+            response.MessageObject = res;
         }
     }
 }

+ 7 - 8
Unity/Assets/Scripts/Hotfix/Client/Demo/NetClient/Ping/PingComponentSystem.cs

@@ -25,14 +25,15 @@ namespace ET.Client
             
             while (true)
             {
-                if (self.InstanceId != instanceId)
-                {
-                    return;
-                }
-
                 long time1 = TimeInfo.Instance.ClientNow();
                 try
                 {
+                    await fiber.Root.GetComponent<TimerComponent>().WaitAsync(2000);
+                    if (self.InstanceId != instanceId)
+                    {
+                        return;
+                    }
+                    
                     // C2G_Ping不需要调用dispose,Call中会判断,如果用了对象池会自动回收
                     C2G_Ping c2GPing = C2G_Ping.Create(true);
                     // 这里response要用using才能回收到池,默认不回收
@@ -47,8 +48,6 @@ namespace ET.Client
                     self.Ping = time2 - time1;
                     
                     TimeInfo.Instance.ServerMinusClientTime = response.Time + (time2 - time1) / 2 - time2;
-                    
-                    await fiber.Root.GetComponent<TimerComponent>().WaitAsync(2000);
                 }
                 catch (RpcException e)
                 {
@@ -58,7 +57,7 @@ namespace ET.Client
                 }
                 catch (Exception e)
                 {
-                    Log.Error($"ping error: \n{e}");
+                    Log.Debug($"ping error: \n{e}");
                 }
             }
         }

+ 4 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_RequestHandler.cs

@@ -7,7 +7,10 @@ namespace ET.Server
     {
         protected override async ETTask Run(Scene root, A2NetInner_Request request, A2NetInner_Response response)
         {
-            response.MessageObject = await root.GetComponent<ProcessOuterSender>().Call(request.ActorId, request.MessageObject, false);
+            int rpcId = request.RpcId;
+            IResponse res = await root.GetComponent<ProcessOuterSender>().Call(request.ActorId, request.MessageObject, false);
+            res.RpcId = rpcId;
+            response.MessageObject = res;
         }
     }
 }

+ 3 - 2
Unity/Assets/Scripts/Hotfix/Server/Module/Message/MessageSenderSystem.cs

@@ -39,14 +39,15 @@ namespace ET.Server
                 bool needException = true
         )
         {
-            request.RpcId = self.GetRpcId();
+            int rpcId = self.GetRpcId();
+            request.RpcId = rpcId;
             
             if (actorId == default)
             {
                 throw new Exception($"actor id is 0: {request}");
             }
 
-            return await self.Call(actorId, request.RpcId, request, needException);
+            return await self.Call(actorId, rpcId, request, needException);
         }
         
         public static async ETTask<IResponse> Call(

+ 19 - 14
Unity/Assets/Scripts/Hotfix/Server/Module/Message/ProcessOuterSenderSystem.cs

@@ -69,18 +69,21 @@ namespace ET.Server
                 case ILocationRequest:
                 case IRequest:
                 {
-                    async ETTask Call()
+                    CallInner().Coroutine();
+                    break;
+
+                    async ETTask CallInner()
                     {
-                        IRequest request = (IRequest)message;
+                        IRequest req = (IRequest)message;
+                        int rpcId = req.RpcId;
                         // 注意这里都不能抛异常,因为这里只是中转消息
-                        IResponse response = await fiber.Root.GetComponent<ProcessInnerSender>().Call(actorId, request, false);
+                        IResponse res = await fiber.Root.GetComponent<ProcessInnerSender>().Call(actorId, req, false);
                         // 注意这里的response会在该协程执行完之后由ProcessInnerSender dispose。
                         actorId.Process = fromProcess;
-                        self.Send(actorId, response);
-                        ((MessageObject)response).Dispose();
+                        res.RpcId = rpcId;
+                        self.Send(actorId, res);
+                        ((MessageObject)res).Dispose();
                     }
-                    Call().Coroutine();
-                    break;
                 }
                 default:
                 {
@@ -149,17 +152,17 @@ namespace ET.Server
         {
             if (response.Error == ErrorCore.ERR_MessageTimeout)
             {
-                self.Tcs.SetException(new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.Request}, response: {response}"));
+                self.SetException(new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.Request}, response: {response}"));
                 return;
             }
 
             if (self.NeedException && ErrorCore.IsRpcNeedThrowException(response.Error))
             {
-                self.Tcs.SetException(new RpcException(response.Error, $"Rpc error: actorId: {self.ActorId} request: {self.Request}, response: {response}"));
+                self.SetException(new RpcException(response.Error, $"Rpc error: actorId: {self.ActorId} request: {self.Request}, response: {response}"));
                 return;
             }
 
-            self.Tcs.SetResult(response);
+            self.SetResult(response);
         }
 
         public static void Send(this ProcessOuterSender self, ActorId actorId, IMessage message)
@@ -202,10 +205,12 @@ namespace ET.Server
             
             int rpcId = self.GetRpcId();
 
-            var tcs = ETTask<IResponse>.Create(true);
+            iRequest.RpcId = rpcId;
 
-            self.requestCallback.Add(self.RpcId, new MessageSenderStruct(actorId, iRequest, tcs, needException));
+            var tcs = ETTask<IResponse>.Create(true);
 
+            self.requestCallback.Add(rpcId, new MessageSenderStruct(actorId, iRequest, tcs, needException));
+            
             self.SendInner(actorId, iRequest as MessageObject);
 
             async ETTask Timeout()
@@ -218,12 +223,12 @@ namespace ET.Server
                 
                 if (needException)
                 {
-                    action.Tcs.SetException(new Exception($"actor sender timeout: {iRequest}"));
+                    action.SetException(new Exception($"actor sender timeout: {iRequest}"));
                 }
                 else
                 {
                     IResponse response = ET.MessageHelper.CreateResponse(iRequest, ErrorCore.ERR_Timeout);
-                    action.Tcs.SetResult(response);
+                    action.SetResult(response);
                 }
             }
 

+ 40 - 12
Unity/Assets/Scripts/Model/Share/Module/Message/Session.cs

@@ -8,13 +8,42 @@ namespace ET
 {
     public readonly struct RpcInfo
     {
-        public readonly IRequest Request;
-        public readonly ETTask<IResponse> Tcs;
+        public readonly bool IsFromPool;
+        public readonly IRequest Request { get; }
+        private readonly ETTask<IResponse> tcs;
 
         public RpcInfo(IRequest request)
         {
             this.Request = request;
-            this.Tcs = ETTask<IResponse>.Create(true);
+            
+            MessageObject messageObject = (MessageObject)this.Request;
+            this.IsFromPool = messageObject.IsFromPool;
+            messageObject.IsFromPool = false;
+
+            this.tcs = ETTask<IResponse>.Create(true);
+        }
+
+        public void SetResult(IResponse response)
+        {
+            MessageObject messageObject = (MessageObject)this.Request;
+            messageObject.IsFromPool = this.IsFromPool;
+            messageObject.Dispose();
+
+            this.tcs.SetResult(response);
+        }
+
+        public void SetException(Exception exception)
+        {
+            MessageObject messageObject = (MessageObject)this.Request;
+            messageObject.IsFromPool = this.IsFromPool;
+            messageObject.Dispose();
+
+            this.tcs.SetException(exception);
+        }
+
+        public async ETTask<IResponse> Wait()
+        {
+            return await this.tcs;
         }
     }
     
@@ -42,7 +71,7 @@ namespace ET
             
             foreach (RpcInfo responseCallback in self.requestCallbacks.Values.ToArray())
             {
-                responseCallback.Tcs.SetException(new RpcException(self.Error, $"session dispose: {self.Id} {self.RemoteAddress}"));
+                responseCallback.SetException(new RpcException(self.Error, $"session dispose: {self.Id} {self.RemoteAddress}"));
             }
 
             Log.Info($"session dispose: {self.RemoteAddress} id: {self.Id} ErrorCode: {self.Error}, please see ErrorCode.cs! {TimeInfo.Instance.ClientNow()}");
@@ -56,13 +85,13 @@ namespace ET
             {
                 return;
             }
-            action.Tcs.SetResult(response);
+            action.SetResult(response);
         }
         
         public static async ETTask<IResponse> Call(this Session self, IRequest request, ETCancellationToken cancellationToken)
         {
             int rpcId = ++self.RpcId;
-            RpcInfo rpcInfo = new RpcInfo(request);
+            RpcInfo rpcInfo = new(request);
             self.requestCallbacks[rpcId] = rpcInfo;
             request.RpcId = rpcId;
 
@@ -70,23 +99,22 @@ namespace ET
             
             void CancelAction()
             {
-                if (!self.requestCallbacks.TryGetValue(rpcId, out RpcInfo action))
+                if (!self.requestCallbacks.Remove(rpcId, out RpcInfo action))
                 {
                     return;
                 }
 
-                self.requestCallbacks.Remove(rpcId);
                 Type responseType = OpcodeType.Instance.GetResponseType(action.Request.GetType());
                 IResponse response = (IResponse) Activator.CreateInstance(responseType);
                 response.Error = ErrorCore.ERR_Cancel;
-                action.Tcs.SetResult(response);
+                action.SetResult(response);
             }
 
             IResponse ret;
             try
             {
                 cancellationToken?.Add(CancelAction);
-                ret = await rpcInfo.Tcs;
+                ret = await rpcInfo.Wait();
             }
             finally
             {
@@ -118,13 +146,13 @@ namespace ET
                         return;
                     }
                     
-                    action.Tcs.SetException(new Exception($"session call timeout: {request} {time}"));
+                    action.SetException(new Exception($"session call timeout: {request} {time}"));
                 }
                 
                 Timeout().Coroutine();
             }
 
-            return await rpcInfo.Tcs;
+            return await rpcInfo.Wait();
         }
 
         public static void Send(this Session self, IMessage message)