【C#/ASP.NET】ThreadStatic変数の使い方
ASP.NETでstatic変数を扱う場合、変数のスコープをしっかり確認しておく必要があります。
フォームアプリケーションでなら、static変数はグローバル変数として扱えます。
しかし、ASP.NETの場合、static変数はASPという大きなプロセスの中に1つしか存在しません。
フォームアプリケーションと同じ感覚で使っていると、複数のユーザーから同時にアクセスがあった時に、大変なことになります。
このような時は、スレッドレベルでのstatic変数を使うことで解決できます。
宣言方法は
[ThreadStatic]
public static int ts;
これだけです。
利用方法はstatic変数と同じで、「クラス名.変数名」で使えます。
スレッドスタティック変数は、スレッドが生成された時に初期化されます。
初期値を指定しなかった時は、int型なら0に初期化されます。
ここで、ASP.NETの特性と合わさって、厄介な動きをします。
ASP.NETでは、リクエストが来た時にスレッドを生成します。
このスレッドの生存期間は、レスポンスを返すまでと同一ではありません。
スレッドの生成にも時間がかかるため、リクエストが次々と飛んでくることを考え、スレッドがプールされています。
すぐに次のリクエストがあった時は、プールしておいたスレッドを再利用するのですね。
この時、スレッドが生成されたわけではありませんので、スレッドスタティック変数の初期化は行われません。
Loadイベント等で、明示的な初期化が必須となります。
通常のstatic変数の利用は、排他制御等ユーザー間の動作を制御したい場合になってくるでしょう。