`
This commit is contained in:
parent
e43ea79f91
commit
de844d7274
68
XNet.Business/ListPolicy.cs
Normal file
68
XNet.Business/ListPolicy.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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()
|
||||
{
|
||||
// 配置对象池参数
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user