2

IISがスレッドで静的変数をどのように処理しているかを理解するのに問題があります。私の理解では、IISに4つのワーカープロセスがあり、4つの要求を同時に処理でき、4つの別々のスレッドがWebサイトを実行しているのと同じであると常に理解しています。静的変数は、個々のスレッドごとに保持されます。私が少し混乱している理由は、接続とキャッシングトランザクションを管理するスコープを作成したためです。アプリをテストしているときは問題はありませんが、コンパイルして2つの異なる場所から同時にヒットした後、ある種の競合が発生しているようです。さて、これらのワーカープロセスが分離しているとしたら、なぜそうなるのでしょうか。1つのワーカースレッドで同時に複数のリクエストを処理できますか?これらの機能を管理するオブジェクトのエスカレーションを処理するためにこれらの静的メンバーに保持されている一意のIDがあり、同じオブジェクトにアクセスしようとしているように見えるため、これは非常に重要です。

これは、x64マシン上のVistaのIISサーバーで実行しています。

編集

単一のリクエストでスレッドを介して永続化する必要がある値については、これらの値を入れてWeb.HttpContext.Current.Items、うまくいくようです。

<ThreadStatic()>使用できますが、リクエストプロセスの終了時に使用できない場合があります。私が持っている1つのモジュールでは、そのスレッドがすでにcahcingサーバーの設定をロードしているかどうかを示すために変数でのみ使用されます。trueの場合、トレッド(asp.netではない)はキャッシュサーバーからデータをフェッチする準備ができています。

4

2 に答える 2

7

変更する最初の概念:ASP.NETを使用している場合、それらはASP.NETスレッドであり、IISスレッドではありません。

次に、これは.NETの問題です。静的変数はAppDomain、.NET全体で共有されます。IISアプリケーションごとに1つAppDomain(多かれ少なかれ)あるため、静的変数はアプリケーション内のすべてのワーカースレッド間で共有されます。

4つを超えるスレッドがあり、それらはすべて同じ変数を共有します。つまり、ロックを実行するか、静的変数を使用しない必要があります。

あなたの理解が常に何であれ、私はあなたが戻って、あなたがその理解をどこから得たのかを理解することを提案します。次に、ASP.NETとはあまり関係がないため、更新します。


編集:主題が変わったので、答えを少し変えます。

これらの変数へのアクセスをインターロックする必要があります。または、デザインの再評価を検討する必要があります。あなたの設計は、静力学にアクセスするためのいくつかの異なるモデルを想定しているようです。この仮定は正しくないことが判明しました。この仮定が設計全体にカスケードされている可能性があります。現実に照らしてデザインを再評価する必要があります。

于 2009-04-07T21:38:18.127 に答える