2009-05-14 4 views
0

L'identité de l'utilisateur ASP.NET n'est pas disponible dans Application.Start, ce qui permet d'écrire dans la base de données. (Le site Web s'exécute sur un hôte partagé, donc je n'ai pas pu configurer les permissions comme j'ai besoin.) Donc, j'ai implémenté ce qui suit dans global.asax. Je ne suis pas sûr si c'est complètement thread safe. Je souhaite supprimer le délégué pour éliminer la vérification des verrous afin d'optimiser les performances.Début de l'application

Je me demande si le "if (TheFirstReq! = Null)" peut échouer. Merci

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(); 
} 

Répondre

0

Votre code est pas thread-safe, le motif double verrouillage tout logiquement que vous pourriez penser qu'il est sans danger est en réalité pas sûr que vous l'avez mis en œuvre. Vous devez ajouter le mot-clé Volatile dans la déclaration TheFirstReq.

Ce MSDN article montre un double contrôle de verrouillage mis en œuvre correctement.