Explorar o código

actor dispose正常终止协程,不抛异常

tanghai %!s(int64=8) %!d(string=hai) anos
pai
achega
0fa5b699c0

+ 6 - 1
Server/Hotfix/System/ActorComponentSystem.cs

@@ -97,7 +97,12 @@ namespace Hotfix
 				try
 				{
 					ActorMessageInfo info = await self.GetAsync();
-					await self.entityActorHandler.Handle(info.Session, self.Entity, info.Message); 
+					// 返回null表示actor已经删除,协程要终止
+					if (info == null)
+					{
+						return;
+					}
+					await self.entityActorHandler.Handle(info.Session, self.Entity, info.Message);
 				}
 				catch (Exception e)
 				{

+ 4 - 2
Server/Model/Component/ActorComponent.cs

@@ -3,7 +3,7 @@ using System.Threading.Tasks;
 
 namespace Model
 {
-	public struct ActorMessageInfo
+	public class ActorMessageInfo
 	{
 		public Session Session;
 		public ActorRequest Message;
@@ -34,7 +34,9 @@ namespace Model
 
 				base.Dispose();
 
-				this.tcs?.SetException(new Exception($"actor disposed! {this.actorId}"));
+				var t = this.tcs;
+				this.tcs = null;
+				t?.SetResult(null);
 
 				Game.Scene.GetComponent<ActorManagerComponent>().Remove(actorId);
 			}