2009年6月22日月曜日

ASP.NET Webサービスでlock構文を使った排他制御

ASP.NET Webサービスでもlock構文を使って排他制御する場合、以下のように記述したりします。

private static int counter = 0;
private static object lockObject = new object();
        :
lock(lockObject)
{
    counter++;
}

でも、どうやってもロックされないと思ったら、↓でした。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7287&forum=7
簡単に言うと、bin フォルダは ASP.NET において特殊な意味を持つフォルダであり、ここのファイルに更新などが発生すると、ASP.NET の環境が再起動されるようになっています(表現が微妙ですが)。
これは、Webアプリケーションが使用しているDLLなどが更新された場合に対応するためです。.NET環境では、既にロードしたアセンブリを再ロードして動作を更新することが出来ないので、環境ごと再起動(再作成?)されます。
ですので、静的なデータも含めてリセットされます。
binフォルダにログを出力していたため、インスタンスが再生成されていました。

ちなみに、共有データはスタティックメンバ変数以外にApplicationオブジェクトでも扱えます。が、このオブジェクトは「基本的には下方互換性、あるいは初心者向けに用意されている機能だと考えた方がよい」そうです(「.NET エンタープライズWebアプリケーション開発技術大全」より)

0 件のコメント:

コメントを投稿