この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 30226|答える: 1

[.NET Core] .NET Coreにおけるオブジェクトプールの詳細な説明

[リンクをコピー]
2020年4月15日 17:38:34に投稿 | | | |
Microsoft.Extensions.ObjectPoolは、オブジェクトのガベージコレクションを許可する代わりに、オブジェクトの再利用のために一連のオブジェクトをメモリに保持することをサポートする ASP.NET コアインフラストラクチャの一部です。
管理したいオブジェクトが そうであれば、オブジェクトプールを使う必要があるかもしれません:

  • 割り当てや初期化はコストがかかります。
  • 限られた資源を表しています。
  • 予測できて頻繁に使うこと。


再利用は重要なテーマであり、私たちが日々の開発でよく直面する避けられない問題です。

最も単純で馴染み深い例を挙げると、データベース接続プールは再利用されたデータベース接続です。

では、再利用の意味は何でしょうか?

簡単に言えば、不要な資源損失を減らすことができます。

データベース接続に加えて、異なるシナリオや要件で再利用が必要な他の多くのオブジェクトがあり、いわゆるオブジェクトプールがあります。

あなた自身もConcurrentBagやConcurrentQueue、あるいは他のソリューションで同様の機能を実装しているはずです。

これはMicrosoftのドキュメントにある実装も共有しています

方法:ConcurrentBagを使ってオブジェクトプールを作成する

ハイパーリンクのログインが見えます。

もちろん、.NET CoreではMicrosoftがシンプルなオブジェクトプールの実装を手伝ってくれました。

まず、新しい.NET Coreコンソールプロジェクトを作成し、nugetコマンドを使って以下のパッケージを追加します。

すべてのコードは以下の通りです:

使用例1



プールを作成する前に、ポリシーを定義する必要があります。 ここでは、付属のDefaultPooledObjectPolicyを直接用いて構築します。

オブジェクトプールには最大数のスレッドが設定されます。

プールオブジェクトのGetメソッドを使って、オブジェクトプールからオブジェクトを取り出します。

上記のコードは結果を実行します

#1-464d2e03-604d-4451-b68a-8a3a2abdfccc-itsvse.com-1/1/0001 00:00 00:00 AM
#2-70122aa0-a949-4c63-b878-321efe64c234-itsvse.com-1/1/0001 午前0時
#3-de717815-796a-4349-a571-047acc125104-itsvse.com-1/1/0001 00:00 00:00 AM
#4-3a404341-a560-47f7-a3b0-0d477a8ae17f-itsvse.com-1/1/0001 00:00 00:00 AM
#5-51c96126-d424-4b58-b07c-6408e6c4cea6-itsvse.com-1/1/0001 0:00:00 AM
#6-7ea4d596-fd2a-43b3-959a-9e48da58a758-itsvse.com-1/1/0001 00:00 00:00 AM
#7-6874c64b-532d-4f92-a4fb-ff472da574a1-itsvse.com-1/1/0001 00:00 00:00
#8-ca767674-2c07-4f26-975f-4711a31d795d-itsvse.com-1/1/0001 午前0時
#9-a9cd1859-a919-46a0-ae5d-85b6d3d11ccb-itsvse.com-1/1/0001 00:00 00:00 AM
#10-fe89ed8b-4dfd-4eef-b876-b2a60ee50958-itsvse.com-1/1/0001 午前0時
この結果は、オブジェクトプール内のオブジェクトが直接新規化され、一部のプロパティが価値が下がっていないことを示しています。これは現時点ではあまり実用的な意味を持たないことが多いです。

DefaultPooledObjectPolicyは新しいオブジェクトなので、多くの場合、これは私たちが期待するものとは違います!

実際の用途を満たしたいなら、ご自身で方針を定義しなければなりません!

使用法2を見てみましょう

使用法2

CreateメソッドはDemoオブジェクトの作成に使われ、ReturnメソッドはDemoオブジェクトをObjectプール(借用済みと返却済み)に再度投入することです。



ここではオブジェクトプールを1つのオブジェクトのみを保持するように定義しています。

オブジェクトプールから取り出した後に1ステップの返還操作があるため、item1とitem2は同じオブジェクトであるべきです。

オブジェクトプールからitem2を取り除いても返されないため、オブジェクトプールは定義したポリシーに基づいて新しいオブジェクトを作成します。

以下は使用2の出力結果です:

985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-4/15/2020 午前3:31:15
985b3232-0a45-4115-8480-ad3d42c0ae10-itsvse.com-4/15/2020 午前3:31:15
True
2020年 8912424a-15c5-4891-b625-25b17eee5c8b-itsvse.com 月4日 午前3時31分15秒
False
アイテム1、アイテム2、アイテム3のそれぞれの性質は同じであり、アイテム1とアイテム2は確かに同一のオブジェクトであることがわかります。 Item3とItem1は同じものではありません。


使用例3

Item1とItem2が同じオブジェクトであることがわかります。 オブジェクトプールからオブジェクトを取得すると最初のものが取られるので、返却して再度取得しても元のものが先に取得されます。



item3はそこで直接オブジェクトプールから取得され、再度作成されません。なぜなら、ここでのオブジェクトプールは複数のオブジェクトを管理しており、使用2では1つだけではなく、プールから直接取得されるからです。

こちらが出力結果です

f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-4/15/2020 午前3:33:58
f3cd5467-536b-4ffe-9c71-de53027b4869-itsvse.com-4/15/2020 午前3:33:58
True
b933b593-af6d-4ebe-b21b-e8784d124764-itsvse.com-4月15日 午前3:33:58
False
使用法2と同様に、本質は同じです。

使用例4

上記の用法は私たちの通常の使い方とはあまり似ていないようです。 それでも注射に頼る必要がある。

では、ついに依存注入の組み合わせ方法を見てみましょう。 もちろん、ここでの本質はポリシーと提供者という二つのものと切り離せません。



まずプロバイダーを登録し、その後直接そのインスタンスを使ってオブジェクトプールを作成します。

他の場所で使いたい場合は、コンストラクタを通じて注入できます。

ここでの結果も前回と同じで、特に言うことはない。

概要

しかし、どのような用途であっても、オブジェクトプールはプール、ポリシー、プロバイダーの3つと切り離せないことを理解する必要があります。

この三人となら、好きにできるかもしれない。

もちろん、興味があればチェックできる特別なものもいくつか用意されています。

LeakTrackingObjectPool(漏水追跡オブジェクトプール)

StringBuilderPooledObjectPolicy





先の:Web Services Enhancements (WSE) 3.0 入門
次に:Visual Studio 2013は、複数の行を置き換えるコンテンツをどのように見つけるのでしょうか?
 地主| 2023年8月30日 18:34:07 に投稿 |
DefaultObjectPoolは基盤レベルで使用されますコンカレントキュースレッドセキュリティキューの実装、ソースコードは以下の通りです:


ハイパーリンクのログインが見えます。


免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com