Как я могу реализовать многократно используемый пул объектов в C #? - PullRequest
4 голосов
/ 12 мая 2011

Я обрабатываю много данных из потокового сокета.Данные используются и оставляются для очистки ГХ.Я хочу выделить многократно используемый пул и использовать его повторно для предотвращения большого количества сборщиков мусора.

Кто-нибудь может мне помочь?

1 Ответ

6 голосов
/ 12 мая 2011

imho это правильный вопрос.Особенно при работе с серверами сокетов, где распределение буферов выполняется часто.Он называется шаблон веса в полете .

Но я бы не принял решение использовать его слегка.

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);
...