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);
}
}
}
}