httpハンドラーインターフェースにおけるbool IsReusableの重要性


130

httpハンドラー/モジュールを作成する場合、呼び出される-bool IsReusableを実装するインターフェースメンバーがあります。

このメンバーの意義は何ですか?これをfalse(またはtrue)に設定した場合、これは残りのWebアプリにとってどのような意味がありますか?


回答:


152

ハンドラーの通常のエントリポイントは、ProcessRequestメソッドです。ただし、構築にコストがかかるいくつかのインスタンス値をまとめるクラスコンストラクターにコードがある場合があります。

Reusableをtrueに指定すると、アプリケーションはインスタンスをキャッシュし、その都度ProcessRequestメソッドを呼び出すだけでインスタンスを別のリクエストで再利用できます。毎回インスタンスを再構築する必要はありません。

アプリケーションは、現在の負荷を処理するために必要な数のこれらのハンドラーをインスタンス化します。

欠点は、必要なインスタンスの数が現在存在するインスタンスよりも多い場合、より多くのメモリが使用されることです。逆に、インスタンス値はGCサイクルに耐え、頻繁に再割り当てする必要がないため、見かけ上のメモリ使用量を減らすこともできます。

別の注意点は、ProcessRequest実行の最後に、オブジェクトの状態を、別のリクエストでオブジェクトを再利用する場合と同じようにする必要があることです。


2
IsReusable = Trueを指定することで達成される主要な最適化として、オブジェクトの再利用について言及しました。IsReusable = Falseを設定すると、サーバーはハンドラーの複数のインスタンスをインスタンス化しなくなります。IE-同時リクエストを排除しますか?
Ian

@Ian私は、再利用可能がfalseの場合、通常のページとして機能すると信じています。再利用可能な場合、2つまたは3つのインスタンス(例のみ)で6つの同時リクエストを処理できる可能性がありますが、再利用できない場合は、1:1のインスタンス/プロセスが必要になります。状態を継続的に更新/再初期化しているときに、1つのワーカースレッドがすべてを処理しようとしたため、.Netが要求を積み重ねることができるとは想像できません。
DavidScherer

47

AnthonyWJonesの回答に加えて、HTTPハンドラーが戻っtrueIsReusableきた場合は、完全にスレッドセーフであることを確認する必要があります。

ドキュメントには、再利用可能なハンドラーを同時に再利用できないことを示すものは何もありませんが、現在のMicrosoftの実装はそれらを連続して再利用するように見えます。ただし、少なくとも理論的には、1つのハンドラインスタンスを複数のリクエストで同時に再利用できるため、他の同時スレッドによって変更される可能性のあるデータに依存しないでください。


厚くて申し訳ありませんが、「コンテキストスイッチ」の意味について詳しく説明してください。sessonまたはクエリ文字列(content.Request.QueryString)からアクセスすると、再利用可能ですか?
zod

5
コンテキストの切り替えとは、CPUがあるスレッドで処理を停止し、別のスレッドで処理を開始することです。つまり、CPUはコンテキストをスレッド間で切り替えました。これはPCで常に発生し、マルチコアコンピューターが存在する前にマルチタスクのような錯覚を与えました。
Larry Dukek、2011

u がいつコンテキストスイッチが存在する可能性があると言ったのかわかりませんでし。urlを入力してEnterキーを押すと、一度に1つのリクエストが実行されます。正しい ?

複数のユーザーがアプリケーションを同時に使用している場合、コンテキストの切り替えが問題になります。たとえば、2人のユーザーが同じレコードを同時に更新したい場合、コンテキストの切り替えが問題を引き起こす可能性があります。
Ishmael Smyrnow 2013年

7
IsReusableスレッドセーフの要求に関するこのステートメントは、AnthonyWJonesの応答と矛盾しているようです。3番目の段落を理解すると(アプリケーションはできるだけ多くのインスタンスを作成します)、再利用可能なハンドラーインスタンスは同時に再利用されず、現在の処理が完了した後でのみ再利用されます。これに該当する場合は、スレッドセーフである必要はありません。
フレデリック

3

そのインスタンスに状態を格納しない場合(つまり、フィールド(別名「クラス変数」)がない場合)は、安全に再利用できます。

安全のため、デフォルトではfalseです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.