106

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

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

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

フォローアップの質問:

  1. リユースとは?
  2. 次の場合に状態 (つまり、クラス変数) を維持できますReusable = trueか??
4

3 に答える 3

96

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

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

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

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

于 2011-03-31T14:03:32.973 に答える
11

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

適切に使用されていない場合に何が起こるかを示す質問は次のとおりです。

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

于 2011-03-31T13:57:13.757 に答える
5

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

編集

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

于 2011-03-31T13:55:13.923 に答える