【发布时间】:2012-11-05 20:50:32
【问题描述】:
我正在尝试在 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;
}
}
}
【问题讨论】:
-
我不知道你要的是什么。您能否提供一些示例代码来说明您拥有的东西,或者您最终希望使用哪种客户端代码?
-
您要自动递增的“键”是什么?返回对象时“重组”集合是什么意思?你的意思是如果你有键“1、2、3、4、5”然后用键“3”删除了项目,那么项目4和5将分别移动到3和4,因此现在有键“1 , 2, 3, 4" 和下一个键是
5而不是6? -
自动增加密钥并重新组织集合?列表不是您要找的吗?它有索引,当你删除一个项目时它会重新组织。
-
pstrjds,这正是我的意思。我有一些代码,但它可能很奇怪,因为我第一次做这样的事情。列表可以提供帮助,但我认为它没有线程安全的替代方案。
-
那么这些键是否只是用于连接对象集合和对象可能持有的数据?另外,非常量大小的“数据”是字节流还是类似的东西?
标签: c# dictionary thread-safety auto-increment pool