IHttpHandler.IsReusableの用途は何ですか?


104

私はを書いてIHttpHandlerおり、IsReusableプロパティを実装する必要があります。MSDNドキュメントを見ると、次のように書かれています。

別の要求がIHttpHandlerインスタンスを使用できるかどうかを示す値を取得します。

これはあまり役に立ちません。どのような状況で再利用可能なハンドラーを使用する必要がありますか?

フォローアップの質問:

  1. 再利用とは何ですか?
  2. 状態(つまり、クラス変数)を維持できますReusable = trueか?

9
こちらをご覧ください: foreachbiscuit.wordpress.com/2007/11/01/…–
Homam

「再利用」とは、ハンドラーの特定のインスタンスで複数の要求を処理することを意味します。セッションには何でも保存できます。ハンドラのインスタンスが解放されても影響を受けません。
IrishChieftain

@IrishChieftainこれは、.Netがインスタンス化されたHttpHandlerのバッグを保持し、1つを選択してそれをコンテキストにフィードするだけのようなものですか?
Kees C. Bakker、2011年

1
@IrishChieftainは現在、いくつかのログ情報の単純なストリーマーに使用しています。しかし、私は、IHttpHandlersをいつどのように使用するかを理解することの意味を理解しようとしています。彼らは多くの人が忘れてしまった機能です。
Kees C. Bakker

回答:


93

このプロパティは、複数のリクエストを同じIHttpHandlerインスタンスで処理できるかどうかを示します。デフォルトでは、リクエストパイプラインの最後に、HttpApplicationのhandlerRecycleListに配置されているすべてのhttpハンドラーがnullに設定されます。ハンドラーが再利用可能な場合、nullに設定されず、インスタンスは次のリクエストで再利用されます。

ガベージコレクションするオブジェクトが少なくなるため、主な利点はパフォーマンスです。
再利用可能なハンドラーの最も重要な問題は、スレッドセーフでなければならないということです。これは簡単なことではなく、多少の努力が必要です。

管理下のリソースのみを使用する場合は、ガベージコレクターで簡単に処理できるため、デフォルト値(再利用不可)のままにすることをお勧めします。再利用可能なハンドラーによるパフォーマンスの向上は、スレッドのバグを見つけるのが難しいというリスクに比べれば、通常は無視できます。

ハンドラーを再利用する場合は、クラス変数の状態を維持しないようにする必要があります。ハンドラーインスタンスに同時にアクセスすると、複数のリクエストが値の書き込み/読み取りを行うためです。


1
クラス変数の状態を維持しないようにするための最後の推奨は、少し混乱します。IsReusableをfalseに設定すると仮定すると、別の要求(同時または非同時)がそのHttpHandlerの同じインスタンスにアクセスする可能性がないため、クラス変数で状態を維持することは安全でしょうか?
Ben Amada

2
承知しました。IHttpHandlerが再利用される場合にのみ適用できることを強調して、最後の推奨を言い換えました。説明してくれてありがとう、ベン!
Branislav Abadjimarinov

7
それだけの価値があるので、私はsetを使用して多くIHttpHandlerのを実装しましたが、問題はありませんでした。心に留めておくべき主なことは、クラスをスコープとする変数を持つのではなく、関数でローカル変数を使用することです。IsReusabletrue
ダナ2014

6
素晴らしい説明。明確で要領を得ています。MSDNの記事がこの簡潔なものであるといいのですが。
AlexVPerl 2015年

1
@Branislav-私があなたの答えを正しく理解した場合。異なるスレッドがハンドラーの異なるインスタンスを同時に利用するだけでなく、異なるスレッドがハンドラーのSAMEインスタンスを同時に実行することも可能ですか?
Ian

11

どうやら、これはハンドラをメモリに保持し、複数のリクエストを処理できるようにします。falseに設定されている場合、着信要求ごとにハンドラーの新しいインスタンスを作成する必要があります。

適切に使用しないとどうなるかを示す質問は次のとおりです。

HttpHandlerを使用したデータベース化された画像のストリーミング


あなたの答えを裏付ける文書はありますか?
キースC.バッカー

4
あなたのように私は:)私はE-Commerceサイトのページに、データベースから画像のテスト負荷に持っていたので、MSDNには満足のいくドキュメントを見つけていないし、次に何が起こったのか観察することができた
IrishChieftain

5

ハンドラーをリサイクルする方が、リクエストが来るたびに新しいハンドラーをリサイクルするよりも安く、サーバーがメモリを節約できるため、GCが実行する必要のある作業が容易になります。ハンドラーが新しいリクエストの処理に問題がない状態にある場合(つまり、ハンドラーインスタンスの状態がリセットされている場合)は、再利用可能であると見なされます。

編集する

私の答えが再利用とは何かを正しく定義しているかどうかはわかりません。実際には同時再利用が可能であるため、効果的に状態を回避するか、スレッドセーフな方法で慎重に管理することをお勧めします。


私もそう思います。そうです、実際の(基本的な)質問は、「再利用とは何ですか?」です。
Kees C. Bakker、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.