web-dev-qa-db-ja.com

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

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

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

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

フォローアップの質問:

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

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

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

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

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

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

適切に使用しないとどうなるかを示す質問を次に示します。

HttpHandlerを使用したデータベースイメージのストリーミング

11
IrishChieftain

リクエストを受信するたびにハンドラーを新しくするよりもハンドラーをリサイクルする方が安価であり、サーバーのメモリ消費量が少なくなるため、GCが実行する必要のある作業が軽減されます。ハンドラーが新しいリクエストの処理に問題がない状態にある場合 (つまり、ハンドラーインスタンスの状態がリセットされました)、その後、再利用可能として認定される必要があります。

編集

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

5
spender