c# で特定のオブジェクト プールを作成しようとしています。getObject と putObject の 2 つの基本的なメソッドと、1 つのスレッドセーフなコレクション (concurrentDictionary) があります (プール内のオブジェクトを識別するためのキーが必要なため)。
しかし、辞書からオブジェクトを削除して返すときは、このコレクションを再編成する必要があり、新しいオブジェクトをコレクションに入れたいときは、キーを自動インクリメントしたいと考えています。これを達成するための解決策はありますか? または、同じ効果を達成するのに役立ち、オブジェクトプールの作成に役立つ他のコレクションはありますか? (オブジェクトを作成するための 2 つのプールがありますが、オブジェクトにはデータを含めることができるため、「データ プール」もいくつかあり、「データ」は一定でないサイズのオブジェクトである必要があります。「データ プール」にはこのソリューションが必要です) .
または、サイズの異なるさまざまなデータを含めることができるオブジェクトでオブジェクトプール(メモリプール)を作成する方法について、いくつかのノウハウがありますか?
いくつかのサンプルコード
->「データオブジェクト」のサイズの最も近い一致を見つけたいので、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;
}
}
}