fc2ブログ

【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変数の利用は、排他制御等ユーザー間の動作を制御したい場合になってくるでしょう。

スポンサーサイト



コメント

非公開コメント

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR