gpt4 book ai didi

c# - 如何在 C# 中实现可重用的对象池?

转载 作者:太空狗 更新时间:2023-10-30 00:57:07 25 4
gpt4 key购买 nike

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

谁能帮帮我?

最佳答案

恕我直言,这是一个有效的问题。特别是在使用频繁分配缓冲区的套接字服务器时。它叫做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);

关于c# - 如何在 C# 中实现可重用的对象池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5975951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com