web-dev-qa-db-ja.com

HTTPハンドラーインターフェイスでのbool IsReusableの重要性

Httpハンドラー/モジュールを作成する場合、実装するインターフェイスメンバーは、- bool IsReusable と呼ばれます。

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

128
GurdeepS

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

Reusableをtrueに指定すると、アプリケーションはProcessRequestメソッドを何度も何度も呼び出すことで、毎回再構築することなく、インスタンスをキャッシュして別のリクエストで再利用できます。

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

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

もう1つの注意点は、ProcessRequestの実行の最後で、オブジェクトの状態が、オブジェクトを再利用する別のリクエストに必要な状態であることを確認する必要があることです。

150
AnthonyWJones

AnthonyWJonesの答えに加えて、HTTPハンドラーがtrueに対してIsReusableを返す場合、完全にスレッドセーフであることを確認する必要があります。

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

46
LukeH

そのインスタンスに状態を保存しない場合(つまり、フィールド(別名「クラス変数」)がない場合)、安全に再利用する必要があります。

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

3
Andrei Rînea