私はを書いてIHttpHandler
おり、IsReusable
プロパティを実装する必要があります。MSDNドキュメントを見ると、次のように書かれています。
別の要求がIHttpHandlerインスタンスを使用できるかどうかを示す値を取得します。
これはあまり役に立ちません。どのような状況で再利用可能なハンドラーを使用する必要がありますか?
フォローアップの質問:
- 再利用とは何ですか?
- 状態(つまり、クラス変数)を維持できます
Reusable = true
か?
私はを書いてIHttpHandler
おり、IsReusable
プロパティを実装する必要があります。MSDNドキュメントを見ると、次のように書かれています。
別の要求がIHttpHandlerインスタンスを使用できるかどうかを示す値を取得します。
これはあまり役に立ちません。どのような状況で再利用可能なハンドラーを使用する必要がありますか?
フォローアップの質問:
Reusable = true
か?回答:
このプロパティは、複数のリクエストを同じIHttpHandlerインスタンスで処理できるかどうかを示します。デフォルトでは、リクエストパイプラインの最後に、HttpApplicationのhandlerRecycleListに配置されているすべてのhttpハンドラーがnullに設定されます。ハンドラーが再利用可能な場合、nullに設定されず、インスタンスは次のリクエストで再利用されます。
ガベージコレクションするオブジェクトが少なくなるため、主な利点はパフォーマンスです。
再利用可能なハンドラーの最も重要な問題は、スレッドセーフでなければならないということです。これは簡単なことではなく、多少の努力が必要です。
管理下のリソースのみを使用する場合は、ガベージコレクターで簡単に処理できるため、デフォルト値(再利用不可)のままにすることをお勧めします。再利用可能なハンドラーによるパフォーマンスの向上は、スレッドのバグを見つけるのが難しいというリスクに比べれば、通常は無視できます。
ハンドラーを再利用する場合は、クラス変数の状態を維持しないようにする必要があります。ハンドラーインスタンスに同時にアクセスすると、複数のリクエストが値の書き込み/読み取りを行うためです。
IHttpHandler
のを実装しましたが、問題はありませんでした。心に留めておくべき主なことは、クラスをスコープとする変数を持つのではなく、関数でローカル変数を使用することです。IsReusable
true
どうやら、これはハンドラをメモリに保持し、複数のリクエストを処理できるようにします。falseに設定されている場合、着信要求ごとにハンドラーの新しいインスタンスを作成する必要があります。
適切に使用しないとどうなるかを示す質問は次のとおりです。
ハンドラーをリサイクルする方が、リクエストが来るたびに新しいハンドラーをリサイクルするよりも安く、サーバーがメモリを節約できるため、GCが実行する必要のある作業が容易になります。ハンドラーが新しいリクエストの処理に問題がない状態にある場合(つまり、ハンドラーインスタンスの状態がリセットされている場合)は、再利用可能であると見なされます。
編集する
私の答えが再利用とは何かを正しく定義しているかどうかはわかりません。実際には同時再利用が可能であるため、効果的に状態を回避するか、スレッドセーフな方法で慎重に管理することをお勧めします。