对于上下文,我正在创建一个网络库,并在内部实现了对象池-- byte[]实例被重用,以避免创建常量的垃圾。
对于我的库的用户,我已经公开了一个公共ref struct Packet,它允许用户对池byte[]执行写操作。以下是代码:
public ref struct Packet
{
private readonly byte[] _buffer;
public Packet()
{
// Here we take a byte-array from the pool.
_buffer = Pool.Get();
}
// Some write methods here...
public void Return()
{
// Here byte-array returns to the pool so it can be reused later.
Pool.Return(_buffer);
}
}虽然所有这些都很好,而且很有效,但是我在这种方法中遇到了一些问题:
Return方法。Return,byte[]将不会被返回并发生泄漏。H 214G 215/code>有些补救说的问题,这是我试过的。每当用户发送数据包时,该发送方法将为用户调用Return方法。
public class Client
{
public void Send(Packet packet)
{
// Performs socket operations here...
// Returns byte-array to the pool so users don't have to.
packet.Return();
}
}虽然这在大多数情况下都能工作,但是如果用户创建了一个包,但没有发送它,那该怎么办呢?再次,泄漏将发生。似乎没有办法在内部使用对象池来隐藏库,而且必须存在公共Return方法,这样用户就可以手动返回byte[],以防他们实际上没有发送数据包。
所以,我想要实现的是:
user.
byte[]
用户甚至没有对Return方法的访问权限,它完全隐藏在被重用(池)的Return实例中,并且总是返回到池中,即使用户没有发送数据包或使用它做任何事情。有什么建议吗?
发布于 2022-05-08 18:26:08
我会考虑实现IDisposable。不过,在调用发送请求时,只从池中获取可能是有益的:
public void Send(Action<Packet> modifyPacket)
{
// Performs socket operations here...
var packet = new Packet();
try
{
modifyPacket(packet);
// send...
}
finally
{
packet.Return();
}
}因此,有效载荷将在最短的时间内离开池。由于我不知道数据包上的方法,我不知道在多远的地方你想隐藏它。但我希望你能明白。
https://stackoverflow.com/questions/72159839
复制相似问题