2009-05-14 12 views
0

データベースへの書き込みを許可するApplication.StartではASP.NETユーザーIDを使用できません。 (Webサイトは共有ホスト上で実行されているため、必要に応じてアクセス権を設定できませんでした。) したがって、global.asaxで次のように実装しました。私は完全にスレッドセーフなのかどうかはわかりません。 デリゲートを削除して、パフォーマンスを最適化するためのロックチェックを排除する必要があります。アプリケーション開始

"if(TheFirstReq!= null)"が失敗する可能性がありますか?あなたはそれが実現していて、論理的にあなたはそれが実際に安全であると思うかもしれないが おかげ

delegate void FirstRequest(); 
static volatile FirstRequest TheFirstReq; 
static object ObjLock = new Object(); 


void Application_Start(object sender, EventArgs e) 
{ 
    // Code that runs on application startup 
    AppStartDateTime = DateTime.Now; 
    TheFirstReq = FirstReq; 
} 

void FirstReq() 
{ 
    lock (ObjLock) 
    { 
     if (TheFirstReq == null) 
      return; 
     TheFirstReq = null; 
     // Log Application start. 
    } 
} 

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if (TheFirstReq != null) 
     TheFirstReq(); 
} 

答えて

0

あなたのコードはスレッドセーフではないが、ダブルロックパターンは安全ではありません。 TheFirstReq宣言にVolatileキーワードを追加する必要があります。

このMSDN articleは、正しく実装されたダブルチェックロックを示しています。

関連する問題