This commit is contained in:
wuyanchen 2025-12-25 15:50:11 +08:00
parent e43ea79f91
commit de844d7274
2 changed files with 68 additions and 62 deletions

View File

@ -0,0 +1,68 @@
using Microsoft.Extensions.ObjectPool;
namespace XNet.Business
{
// ========== 核心:继承 DefaultPooledObjectPolicy 并重写 Create/Return ==========
/// <summary>
/// 自定义 Agent 消息列表池化策略(重写 Create/Return
/// </summary>
public sealed class SyncMsgListPolicy : DefaultPooledObjectPolicy<List<AgentPositionSyncMsg>>
{
// 重写 Create 方法:指定初始容量,减少扩容开销
public override List<AgentPositionSyncMsg> Create()
{
return new List<AgentPositionSyncMsg>(100); // 初始容量100
}
// 重写 Return 方法:清空列表数据,保留容量
public override bool Return(List<AgentPositionSyncMsg> obj)
{
obj.Clear(); // 关键:归还前清空数据,避免脏数据
return true; // 返回true表示可复用
}
}
/// <summary>
/// 自定义失效连接列表池化策略
/// </summary>
public sealed class DeadConnListPolicy : DefaultPooledObjectPolicy<List<string>>
{
public override List<string> Create()
{
return new List<string>(50); // 初始容量50
}
public override bool Return(List<string> obj)
{
obj.Clear();
return true;
}
}
// ========== 2. byte[] 直接实现 IPooledPolicy绕过 new() 约束) ==========
public sealed class ByteArrayPolicy : IPooledObjectPolicy<byte[]>
{
private readonly int _defaultSize;
public ByteArrayPolicy(int defaultSize = 4096)
{
_defaultSize = defaultSize;
}
// 直接实现 Create 方法,自定义数组创建逻辑(指定长度)
public byte[] Create()
{
return new byte[_defaultSize]; // 合法:数组创建必须指定长度
}
// 直接实现 Return 方法,自定义归还逻辑
public bool Return(byte[] obj)
{
if (obj.Length != _defaultSize) return false; // 仅复用指定大小的数组
Array.Clear(obj); // 清空数据,避免泄露
return true;
}
}
}

View File

@ -22,68 +22,6 @@ namespace XNet.Business
private readonly ObjectPool<byte[]> _byteArrayPool;
// ========== 核心:继承 DefaultPooledObjectPolicy 并重写 Create/Return ==========
/// <summary>
/// 自定义 Agent 消息列表池化策略(重写 Create/Return
/// </summary>
public sealed class SyncMsgListPolicy : DefaultPooledObjectPolicy<List<AgentPositionSyncMsg>>
{
// 重写 Create 方法:指定初始容量,减少扩容开销
public override List<AgentPositionSyncMsg> Create()
{
return new List<AgentPositionSyncMsg>(100); // 初始容量100
}
// 重写 Return 方法:清空列表数据,保留容量
public override bool Return(List<AgentPositionSyncMsg> obj)
{
obj.Clear(); // 关键:归还前清空数据,避免脏数据
return true; // 返回true表示可复用
}
}
/// <summary>
/// 自定义失效连接列表池化策略
/// </summary>
public sealed class DeadConnListPolicy : DefaultPooledObjectPolicy<List<string>>
{
public override List<string> Create()
{
return new List<string>(50); // 初始容量50
}
public override bool Return(List<string> obj)
{
obj.Clear();
return true;
}
}
// ========== 2. byte[] 直接实现 IPooledPolicy绕过 new() 约束) ==========
public sealed class ByteArrayPolicy : IPooledObjectPolicy<byte[]>
{
private readonly int _defaultSize;
public ByteArrayPolicy(int defaultSize = 4096)
{
_defaultSize = defaultSize;
}
// 直接实现 Create 方法,自定义数组创建逻辑(指定长度)
public byte[] Create()
{
return new byte[_defaultSize]; // 合法:数组创建必须指定长度
}
// 直接实现 Return 方法,自定义归还逻辑
public bool Return(byte[] obj)
{
if (obj.Length != _defaultSize) return false; // 仅复用指定大小的数组
Array.Clear(obj); // 清空数据,避免泄露
return true;
}
}
public WsConnectionManager()
{
// 配置对象池参数