首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何隐藏对象池?

如何隐藏对象池?
EN

Stack Overflow用户
提问于 2022-05-08 09:52:21
回答 1查看 56关注 0票数 1

对于上下文,我正在创建一个网络库,并在内部实现了对象池-- byte[]实例被重用,以避免创建常量的垃圾。

对于我的库的用户,我已经公开了一个公共ref struct Packet,它允许用户对池byte[]执行写操作。以下是代码:

代码语言:javascript
复制
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);
    }
}

虽然所有这些都很好,而且很有效,但是我在这种方法中遇到了一些问题:

  1. I正在泄漏实现细节:用户不应该真正知道或关心数据包是如何得到的,他们只想获取数据包,向其写入一些数据并发送数据。当用户使用数据包时,
  2. 迫使用户调用Return方法。
  3. 如果用户忘记调用Returnbyte[]将不会被返回并发生泄漏。H 214G 215/code>

有些补救说的问题,这是我试过的。每当用户发送数据包时,该发送方法将为用户调用Return方法。

代码语言:javascript
复制
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实例中,并且总是返回到池中,即使用户没有发送数据包或使用它做任何事情。

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2022-05-08 18:26:08

我会考虑实现IDisposable。不过,在调用发送请求时,只从池中获取可能是有益的:

代码语言:javascript
复制
public void Send(Action<Packet> modifyPacket)
{
    // Performs socket operations here...
    var packet = new Packet();
    try
    {
        modifyPacket(packet);        
        // send...
    }
    finally
    {
        packet.Return();
    }
}

因此,有效载荷将在最短的时间内离开池。由于我不知道数据包上的方法,我不知道在多远的地方你想隐藏它。但我希望你能明白。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72159839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档