【发布时间】:2021-03-19 08:55:23
【问题描述】:
我有一个循环池实现
public class CircularPool<T> where T : class, new()
{
private readonly Queue<T> instances;
public CircularPool(int size)
{
instances = new Queue<T>(size);
for (var i = 0; i < size; ++i)
{
instances.Enqueue(new T());
}
}
public T GetInstance()
{
var instance = instances.Dequeue();
instances.Enqueue(instance); // Circular pool
return instance;
}
public void ReturnInstance(T instance)
{
// What does returning look like?
// Could use IsActive flag?
}
public IEnumerable<T> GetActiveInstances()
{
return instances; // TODO: Only want the active ones
}
}
我希望能够跟踪池中当前正在使用的实例,以便对它们进行迭代并执行各种操作
var pool = new CircularPool<Foo>(5);
var fooInstanceA = pool.GetInstance();
var fooInstanceB = pool.GetInstance();
var fooInstanceC = pool.GetInstance();
pool.ReturnInstance(fooInstanceB);
foreach (var activeInstance in pool.GetActiveInstances())
{
// Do stuff with active instances (fooInstanceA then fooInstanceC)
}
如何正确获取按年龄排序的活跃实例?
假设这是一个循环池,那么如果调用 GetInstance 的次数超过了池的大小而没有调用 ReturnInstance,则返回最旧的活动实例并成为最年轻的活动实例。这应该相应地反映在 GetActiveInstances 中。
另外,在循环池的上下文中 ReturnInstance 应该是什么样子?
【问题讨论】:
-
'循环池'据我所知不是常见的数据结构之一。您打算将数据结构用于什么?它必须履行的合同是什么?还是您的意思是环形缓冲区或对象池?
-
我认为您需要另一个
Queue来保存活动项目。