【问题标题】:How can I implement a reusable object pool in C#?如何在 C# 中实现可重用的对象池?
【发布时间】:2011-05-12 09:27:44
【问题描述】:

我正在处理来自流式套接字的大量数据。数据被使用并留给 GC 清理。我想预先分配一个可重用的池并重用它以防止大量 GC。

谁能帮帮我?

【问题讨论】:

标签: c# object-pooling


【解决方案1】:

恕我直言,这是一个有效的问题。特别是在使用频繁分配缓冲区的套接字服务器时。它叫做flyweight pattern

但我不会轻易决定使用它。

class BufferPool<T>
{
    private readonly Func<T> _factoryMethod;
    private ConcurrentQueue<T> _queue = new ConcurrentQueue<T>();

    public BufferPool(Func<T> factoryMethod)
    {
        _factoryMethod = factoryMethod;
    }

    public void Allocate(int count)
    {
        for (int i = 0; i < count; i++)
            _queue.Enqueue(_factoryMethod());
    }

    public T Dequeue()
    {
        T buffer;
        return !_queue.TryDequeue(out buffer) ? _factoryMethod() : buffer;
    }

    public void Enqueue(T buffer)
    {
        _queue.Enqueue(buffer);
    }
}

用法:

var myPool = new BufferPool<byte[]>(() => new byte[65535]);
myPool.Allocate(1000);

var buffer= myPool.Dequeue();
// .. do something here ..
myPool.Enqueue(buffer);

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2013-04-30
    • 2014-05-09
    相关资源
    最近更新 更多