2012-02-08 14 views
0

オブジェクトプールに異なる3種類のオブジェクトを格納する必要があり、必要に応じて検索する必要があります。プールから別のオブジェクトを取得する方法は?

私はQueueで実装しようとしましたが、1つのタイプしか使用できませんでした。

オブジェクトプールに異なる種類のオブジェクトを格納して検索することはできますか?

+1

あなたの質問は何ですか? – Blorgbeard

+0

質問はどこですか? – user492238

+0

異なるタイプに共通のインターフェイスがあり、このインターフェイスタイプのキューを使用できます。 – Filburt

答えて

1

System.Collections.QueueとSystem.Collections.Generic.Queueには違いがあります。私はあなたが後者を参照していると思います。前者は弱く型付けされ、後者は強く型付けされます(つまり型を指定する必要があります)。

オブジェクトを使用することの欠点は、検査するオブジェクトを取得する(つまりキャストする)たびにbox/unboxする必要があり、いつどのタイプのbi switch文を使用してこのオブジェクトはです。この問題を回避するには、オブジェクトに関する型付き情報を格納するための追加のデータ構造を使用します。

2

ジェネリックプールの実装の使用を検討してください。

private static Stack<T1> poolT1 = new Stack<T1>(); 
... 
T1 myobject = poolT1.Pop(); 

私は個人的には潜在的にメモリの局所性を向上させ、最近使用されたオブジェクトをバック与えますので、キューの上にスタックを好むことをお勧め - それゆえ、より良いキャッシュ・パフォーマンス原因:プールするために必要なオブジェクトの種類ごとに個別のプールを使用してください。

2

Queue<T>は、キーなどでデータに頻繁にアクセスするため、オブジェクトプーリングには適していません。したがって、ConcurrentDictionary<string, object>は、この場合、複数スレッドのアプリケーションで使用されます。あなたはあなたのコードをより明確にするためにそれをラップすることができます:

public class Pool 
{ 
    private ConcurrentDictionary<string, object> m_data = new ConcurrentDictionary<string, object>(); 

    public T Take<T>(string key) 
    { 
     //fetch data from the dictionary and convert it to the type you want 
    } 

    //other methods like Insert... 
} 
0

あなたがプールするオブジェクトの種類ごとにスタックを持つことができます。あなたの場合、それは3スタックになります。プールのGetメソッドの中に、適切なオブジェクトを取得するためにどのプールを使用するかを決定するロジックがあります。 Getメソッドにパラメータを渡すことで行いますが、それは特定の実装に依存します。あなたの無料の方法では

public IType Get(int type) 
{ 
    switch (type) 
    { 
     case 1: 
      if (pool1.Count == 0) 
      { 
       return new MyObject1(); 
      } 
      else 
      { 
       return pool1.Pop(); 
      } 
      break; 
     case 2: 
      if (pool2.Count == 0) 
      { 
       return new MyObject2(); 
      } 
      else 
      { 
       return pool2.Pop(); 
      } 
      break; 
     case 3: 
      if (pool3.Count == 0) 
      { 
       return new MyObject3(); 
      } 
      else 
      { 
       return pool3.Pop(); 
      } 
      break; 
    } 
} 

、あなたがもしを持つことができます... ELSEこのような:

理想的
public void Free(IType obj) 
{ 
    if (obj is MyObject1) 
    { 
     if (pool1.Count < MAX_POOL_SIZE) 
      pool1.Push(obj); 
    } 
    else if (obj is MyObject2) 
    { 
     if (pool2.Count < MAX_POOL_SIZE) 
      pool2.Push(obj); 
    } 
    else if (obj is MyObject2) 
    { 
     if (pool3.Count < MAX_POOL_SIZE) 
      pool3.Push(obj); 
    } 
} 

、あなたは、プールされたオブジェクトのクラスを管理しています。その場合、明示的に真の型を指定するプロパティを追加し、Freeメソッドでは、リフレクションを使用する代わりにそのプロパティでロジックを行います。そうすればより良いパフォーマンスが得られます。

関連する問題