まず、オブジェクトプール
、大幅に性能を向上させることができるオブジェクトプーリング手法を使用して場合は特に高い周波数以上のオブジェクトの初期化プロセスのコスト。ここでObjectPoolソース関与するいくつかのクラスがあります。あなたがネットコアのソースコードをたくさん見てきたときは、プロバイダによって、最終的なクラスを作成し、それらの多くは、プロバイダポリシーによって構築され、このモデルのMicrosoftの開発されていることがわかります。
第二に、使用
このコンポーネントの主な目的は、再利用オブジェクトを実装し、再作成する必要はありません、直接拾うために時間を使い、オブジェクトプールにオブジェクトを保存することです。しかし、問題は数がプール内のオブジェクトをターゲットまたはどのように行うには、プール内のオブジェクトの数よりも大きくなり始めている場合は、ありますか?オブジェクトのプール内のオブジェクトの数が不十分、オブジェクトをピックアップして、この時間は、オブジェクトがポリシーで作成する必要がある場合は、オブジェクトを作成する方法のように、あなたが実装する必要があります。上記のポリシーは、デフォルトの実装があり DefaultPooledObjectPolicyは 、その作成には)新しいT(です。
DefaultObjectPool <ユーザー>は持ってDefaultPool = 新しい新しい DefaultObjectPool <ユーザー>(新新 DefaultPooledObjectPolicy <ユーザ>()、2 ); VARを firstUser defaultPool.Get =(); //、プールは、オブジェクトがあるオブジェクトされていないプールからオブジェクトを取得、NAME = 0 = NULL年齢返し するvar USER1 = 新しい新しいユーザー() { 対象年齢 = 18であり、 名前 = " MicroHeart " }; VARの USER2 = 新しい新しいユーザー() { 年齢 = 19 、 名前= " MicroHeart " }; VARの USER3 = 新しい新しいユーザー() { 対象年齢 = 20であり、 名前 = " MicroHeart " }; defaultPool.Return(USER1); // オブジェクトがプールに戻され、必ずしも成功していません。そのようにプール内のオブジェクトは、数の制限だけでなく、カスタム制限をプールし、一部のオブジェクトが配置できない defaultPool.Return(USER2); defaultPool.Return(USER3); VARの U1 = defaultPool.Get(); //プールからオブジェクトを服用中、最初のUSER1用に返さ するvar)U2 = defaultPool.Get(; //プールからオブジェクトを取得し、第2の戻りに配置されたユーザー2の VAR= defaultPool.GetのU3(); //プールは、オブジェクト・ポリシーは、メソッド呼び出しを作成、取得、オブジェクトの目的ではない、この時間と DefaultPooledObjectPolicy Createメソッドを実現するためには、次のとおりです。新しいT()、フローは年齢= 0名= NULLを戻します
オブジェクトが実際には、新しいT()検索方法、取得されていないプール内の上記オブジェクトの例。オブジェクトに、次の3つのオブジェクトを追加しますが、オブジェクトプール2つだけのスペースは、3つ目はに追加されません。
今、あなた自身のポリシーを1つ作成します
パブリック クラス MyUserPolicy:PooledObjectPolicy <ユーザー> //需要继承抽象类 { 公共 オーバーライドユーザー(作成) { 返す 新しい)ユーザー( { 年齢 = 18 、 名前 = " MicroHeart " }; } 公共 オーバーライド ブール復路(ユーザユーザ) { 場合(user.Age == 18 ) を返す 偽。 返す 真; } }
DefaultObjectPool <ユーザー> defaultPool = 新しい DefaultObjectPool <ユーザー>(新しい MyUserPolicy()、2 )。 VAR firstUser = defaultPool.Get()。// 返回年齢= 0名=ヌル するvar USER1 = 新しいユーザー() { 年齢 = 18 、 名前 = " MicroHeart " }。 VaRの user2が= 新しいユーザー() { 年齢 = 19 、 名前 = "MicroHeart " }; VARの USER3 = 新しい新しいユーザー() { 年齢 = 20であり、 名前 = " MicroHeart " }; defaultPool.Return(USER1); defaultPool.Return(USER2); defaultPool.Return(USER3); VAR U1 = defaultPool.Get (); // user1が、= 18年齢はuser2、Retureのポリシーフィルタはfalseを返すので、戻りは、ユーザーがプールに最初にコネクタを引き起こす可能性があります。 VARの U2 = defaultPool.Get(); //はUSER3リターン するvar U3を= defaultPool.Get(); //戻り年齢= 18名= MicroHeartは、このポリシーを作成して使用して作成されます
第三に、解決の源
IPooledObjectPolicy <T>: 主な役割は、接続プールにオブジェクトとオブジェクトを作成することです
作成:十分な接続プールオブジェクトを撮影した数がこの方法によって作成されたオブジェクトの定義方法を、作成します。
戻る:オブジェクトを接続プールに、首尾よく置かれている場合、トゥーレは、そうでない場合はFalseを返す。..
DefaultPooledObjectPolicy <T>:継承された抽象クラスPooledObjectPolicy <T>、インタフェースIPooledObjectPolicy <T>を継承する抽象クラスをポンピングしながら。デフォルトのPolicy実装クラス
作成:新しいT()のオブジェクトを作成するために、デフォルトのメソッドを定義します。
戻る:プールへの接続かどうかに関係なく、すべてがTrueを返します。
ObjectPoolProvider:オブジェクトプール(ObjectPool)を作成
抽象ObjectPool <T>作成<T>(IPooledObjectPolicy <T>ポリシー):通过ポリシー创建ObjectPool
DefaultObjectPoolProvider:デフォルトの実装クラスObjectPoolProvider
ObjectPool <T>作成<T>(IPooledObjectPolicy <T>ポリシー):X2は、オブジェクトのプールを収容することができるプロセッサの数を作成します。
ObjectPool <T>:プール
T)(取得:プールからオブジェクトを取得します。
voidを返す(TのOBJ):オブジェクト・プール内のオブジェクトを配置します。
DefaultObjectPool:デフォルトのオブジェクトプール実装クラスを取得し、返しメソッドを実装します。実際には、のオブジェクトプールの性質である ObjectWrapper [] _items、 オブジェクトがObjectWrapper配列に配置された場合、リターンが使用されています。メソッドは、配列から取得します。