トップ回答者
画面上にあるコントロールの例外処理について

質問
回答
-
以下が参考になると思います。ただ、以下の例ではlock(VBだとSyncLock)をしていないので、lockをしてスレッドセーフにして下さい。
[ASP.NET]アプリケーション内で発生したエラー情報をロギングするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/168asperrlog/asperrlog.html
すべての返信
-
以下が参考になると思います。ただ、以下の例ではlock(VBだとSyncLock)をしていないので、lockをしてスレッドセーフにして下さい。
[ASP.NET]アプリケーション内で発生したエラー情報をロギングするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/168asperrlog/asperrlog.html -
>以下が参考になると思います。ただ、以下の例ではlock(VBだとSyncLock)をしていないので、lockをしてスレッドセーフにして下さい。
念のため注意点です。
もし例のようにファイルに直接書き出すのなら、Mutex辺りを使って排他するほうが良いです。あと、やってはいけないこと…
lock (this)
{
}や
SyncLock Me
End SyncLock※thisをロックするな、という話とはまた別で、インスタンスレベルでロックしても意味がないという話です。
まあ、本当はもともとスレッドセーフに作成されているログ出力機能を使用するべきですけどね。
-
>なるほどそうですね。IIS6.0にはワーカープロセス分離モードがあるので、Mutexの方が良いということですね?
重点は2つあって、
1)ワーカープロセスなどが複数同時に動作することがあり得る
これは、Webガーデン等、複数プロセスが動作するように設定した場合や、
たとえそうでなくとも、ワーカープロセスのリサイクル時に一時的に同時に
動作することがあり得るためです。
プロセスのリサイクル時は、ログ出力などを行う可能性が高いタイミングです。2)Global.asaxに関する誤解を招くあるいは誤解している人が多い気がする
Global.asaxのインスタンスは、各リクエストの処理毎に独立しています。
プールされたインスタンスの再利用は行われますが、同時処理している
インスタンスは全て独立しています。
したがって、Global.asaxのインスタンス単位でロックをかけても、何ら排他
制御にはなりません。まあ、実際にログ出力などを行う場合は、Mutex等で排他するか、あるいは
最初に出力先ファイルを排他オープンして、失敗したらファイル名を変えるなど
やりかたはいろいろです。いいたかったことは、Global.asaxでlockを行う、というのは間違った処理を
行う方向に誘導してしまう可能性があるので、注意が必要ということです。 -
なちゃ さんからの引用
たとえそうでなくとも、ワーカープロセスのリサイクル時に一時的に同時に
動作することがあり得るためです。
プロセスのリサイクル時は、ログ出力などを行う可能性が高いタイミングです。
なるほど。ここは特に勉強になりました。なちゃ さんからの引用
2)Global.asaxに関する誤解を招くあるいは誤解している人が多い気がする
Global.asaxのインスタンスは、各リクエストの処理毎に独立しています。
プールされたインスタンスの再利用は行われますが、同時処理している
インスタンスは全て独立しています。
したがって、Global.asaxのインスタンス単位でロックをかけても、何ら排他
制御にはなりません。
いわゆるASP.NETのSingleCallモデルに関係してますね。なちゃ さんからの引用
いいたかったことは、Global.asaxでlockを行う、というのは間違った処理を
行う方向に誘導してしまう可能性があるので、注意が必要ということです。
確かにその通りだと思います。フォロー、ありがとうございました。