如何在C#中实现可重用对象池?
我正在从流式套接字处理大量数据。数据被使用并留给GC清理。我想预先分配一个可重用的池,并重用它以防止大量的GCs如何在C#中实现可重用对象池?,c#,object-pooling,C#,Object Pooling,我正在从流式套接字处理大量数据。数据被使用并留给GC清理。我想预先分配一个可重用的池,并重用它以防止大量的GCs 有人能帮我吗?我想这是个合理的问题。特别是在使用频繁分配缓冲区的套接字服务器时。它叫 但我不会轻易决定使用它 class BufferPool<T> { private readonly Func<T> _factoryMethod; private ConcurrentQueue<T> _queue = new Concurren
有人能帮我吗?我想这是个合理的问题。特别是在使用频繁分配缓冲区的套接字服务器时。它叫 但我不会轻易决定使用它
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);
}
}
类缓冲池
{
私有只读Func\u factoryMethod;
私有ConcurrentQueue_queue=新ConcurrentQueue();
公共缓冲池(Func factoryMethod)
{
_factoryMethod=factoryMethod;
}
公共无效分配(整数计数)
{
for(int i=0;i
用法:
var myPool = new BufferPool<byte[]>(() => new byte[65535]);
myPool.Allocate(1000);
var buffer= myPool.Dequeue();
// .. do something here ..
myPool.Enqueue(buffer);
var myPool=new BufferPool(()=>new byte[65535]);
myPool.Allocate(1000);
var buffer=myPool.Dequeue();
// .. 在这里做点什么。。
myPool.Enqueue(缓冲区);
这个问题有一个更新版本: