我正在尝试在 c# 中创建特定的对象池。我有两种基本方法,getObject 和 putObject 以及一个线程安全集合 - concurrentDictionary(因为需要一些键来识别池中的对象)。
但是当我从字典中删除并返回对象时,我需要重新组织这个集合,并且当我想将新对象放入集合时,我想自动递增键。有什么解决方案可以实现这一目标吗?或者任何其他可以帮助我达到相同效果并可以帮助我创建对象池的集合?(我有两个池,一个用于创建对象,但对象可以包含数据,所以我还有一些“数据池”和“数据”应该是具有一些非常量大小的对象,我需要这个“数据池”解决方案) .
或者,您是否有一些诀窍,如何使用对象制作对象池(内存池)而不是可以包含不同大小的不同数据?
一些示例代码
-> Foreach 在那里,因为我想找到“数据对象”大小最接近的匹配,然后,如果有任何合适的对象,我想返回它。如果没有,我创建新的。
namespace MPool
{
public class DataPool<T>
{
private ConcurrentDictionary<int,T> _objects;
private Func<T> _objectGenerator;
public DataPool(Func<T> objectGenerator)
{
if (objectGenerator == null)
throw new ArgumentNullException("Chyba metoda objectGenerator");
_objects = new ConcurrentDictionary<int,T>();
_objectGenerator = objectGenerator;
}
public T GetObject(int size)
{
int diverse = Int32.MaxValue;
T item = default(T);
int key = -1;
foreach (KeyValuePair<int,T> obj in _objects) {
if (GetObjectSize(obj.Value) == size) {
//item = obj.Value;
key = obj.Key;
break;
} else {
if (Math.Abs((GetObjectSize(obj.Value) - size)) < diverse) {
diverse = Math.Abs((GetObjectSize(obj.Value) - size));
if (diverse < (2 * GetObjectSize(obj.Value))) {
//item = obj.Value;
key = obj.Key;
}
}
}
}
if (key==-1) {
return _objectGenerator();
} else {
_objects.TryRemove(key, out item);
return item;
}
}
public void PutObject(T item)
{
//_objects.AddOrUpdate
}
public void Free()
{
while (!_objects.IsEmpty) {
_objects.Clear();
}
}
private int GetObjectSize(T TestObject)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
byte[] Array;
bf.Serialize(ms, TestObject);
Array = ms.ToArray();
return Array.Length;
}
}
}