using System.Collections.Concurrent; using System.Threading.Tasks; using GameMessage; using MrWu.Debug; using Server.Core; using Server.Core.Extend; namespace Server.Net { /// /// 游戏包 /// public class GamePacket : Reference { /// /// 消息Code /// public int OpCode { get; private set; } /// /// 消息数据 /// public MessageData MessageData { get; private set; } /// /// 谁发来的 - 包处理完会释放 /// public IUserSession Session { get; set; } /// /// 任务 /// private ConcurrentQueue Tasks = new ConcurrentQueue(); public static GamePacket Create(int opCode, MessageData messageData) { GamePacket packet = ReferencePool.Fetch(); packet.OpCode = opCode; packet.MessageData = messageData; #if DEBUG if (!packet.Tasks.IsEmpty) { Debug.Fatal("Packet has task!"); } #endif return packet; } public static GamePacket Create(int opCode, MessageData messageData,IUserSession session) { GamePacket packet = ReferencePool.Fetch(); packet.OpCode = opCode; packet.MessageData = messageData; packet.Session = session; #if DEBUG if (!packet.Tasks.IsEmpty) { Debug.Fatal("Packet has task!"); } #endif return packet; } public void BeginTask(Task task) { if (task == null) { return; } Tasks.Enqueue(task); } public Task Wait() { if (Tasks.IsEmpty) { return Task.CompletedTask; } //等待所有任务完成 return Task.WhenAll(Tasks); } public override void Dispose() { if (IsFromPool) { MessageData = null; if (Session is ProxySession proxySession) { proxySession.Dispose(); } Tasks.Clear(); Session = null; ReferencePool.Recycle(this); } } } }