HttpModule は作業スレッド間で共有されますか?
-
26-09-2019 - |
質問
インスタンスメンバーへのアクセスをロックする必要がありますか?
例:
public class HttpModule : IHttpModule
{
//...
Dictionary<int, int> foo;
void UseFoo(int a, int b)
{
foo[a] = b;
}
}
解決
MSDN ドキュメントからは今のところはっきりとはわかりませんが、次の情報を見つけました。 答えを知っていると主張する人からのフォーラムへの投稿. 。期待してはいけないようですね 悪い質 実装では起こりますが、次のことに注意してください。 foo
の状態は、必ずしもすべての結果で共有されるわけではありません。 HttpModule
ごとに 1 回作成されます HttpApplication
IIS がプール内に保持することを選択したもの。
他のヒント
私はIIS6で観察していると、ここで、この質問に関連した私の調査結果を提供したかっます:
私はIIS6で広くこの問題を扱ってきたし、キャプチャ実行履歴にlog4netの反射を利用するいくつかの興味深い結果を発見しました。私が発見したことは、舞台裏で起こって大規模な「スレッド管理」は存在することです。 HttpApplication
に1:1に対応するスレッドの「主」シリーズがあるようです。これらのスレッドは、しかし排他的にあなたの要求のためのパイプラインを処理しませんします。これらのインスタンスにアクセスしたときの種々の異なるサブスレッドはを呼び出すことができます。あなたのアプリケーションが利用する後続の新しい要求とリソース要求は、元の要求に関連するいくつかの永続的な情報を共有しているようだが、まだ関係のいくつかのタイプを示す初期スレッドによって完全に処理されることはありません。私はそれが一見ランダムだったので、他のスレッドにdivviedされた要素へと(私は先に説明したもの以外の)任意の具体的なパターンを識別することができませんでした。この証拠に私の結論は、階層的なプールのいくつかの概念があるということですか?参照要素のいくつかの未知のサブセットが親参照を介して子スレッドに継承されている場合に発生ます。
私はそのHttpModules
を言うので、答えとしての のあるスレッド間で共有。値はモジュールを使用して、いくつかの状態を維持しなければならないすべての要求に適用する場合は、インスタンス値をロックするという点では、これが適用可能であろう。私は、彼らが後続の要求で再利用できるように確認するために高価であり、ステートフルなインスタンス値を維持しようとするならば、これは有用である見ることができます。
この問題は、うまくいけば、この情報が誰かを助け、いくつかの時間のために私を悩まれていた。
最近、この質問に少し触れた記事を見つけました。http://www.dominicpettifer.co.uk/Blog/41/ihttpmodule-gotchas---the-init---method-can-get-call-multiple-times
スレッドについては言及されていませんが、ワーカープロセスが
必要と思われる限り多くのhttpapplicationオブジェクトをインスタンス化してから、パフォーマンス上の理由でプールし、新しいリクエストがプールに送り返される前にインスタンスを再利用します。
リンクからのコードに従うと、init コードがスレッドセーフな方法で 1 回実行されることを確認できます。
private static bool HasAppStarted = false;
private readonly static object _syncObject = new object();
public void Init(HttpApplication context)
{
if (!HasAppStarted)
{
lock (_syncObject)
{
if (!HasAppStarted)
{
// Run application StartUp code here
HasAppStarted = true;
}
}
}
}
これが正しいかどうかを確認するために、これを実行してテストするためのテスト アプリをセットアップしようと考えていましたが、時間がありませんでした。
ジムによって投稿記事は面白いですが、ジムが言うように、それは、スレッドの安全性については何も言及していない。
私はあなたが静的メンバの初期化や初期化、すなわち静的リソースを初期化する「一度だけ」実行している場合にのみ、ロック機構が必要になると思います。
私は、MSDNでも、我々は非静的クラス変数を初期化するロック機構を必要とすることをジムで言及した記事から結論づけることができませんでした。