2010-10-20 10 views
0

J'ai un peu de code que j'ai essayé d'examiner pour la sécurité des threads. J'utilise le modèle de base paresseux singleton trouvé here. Je me demandais si c'est encore thread-safe si je mets l'instance dans l'objet HttpApplicationState. J'ai besoin d'accéder à cette instance à travers toutes les instances de l'application web, donc si ce n'est pas sûr pour les threads, comment puis-je rendre le thread sûr?Sécurité du thread de l'instance singleton C# dans ApplicationState


public sealed class EmailWorker { 
    private HttpApplicationState _app; 
    private const EMAIL_WORKER = "EmailWorker"; 

    EmailWorker() { } 

    class NestedWorker { 
     static NestedWorker() { } 
     internal static readonly EmailWorker Instance = new EmailWorker(); 
    } 

    public static void Initialize(HttpApplicationState appState) { 
     _appState = appState; 
     _appState.Lock(); 
     if (_appState[EMAIL_WORKER] == null) { 
      _appState.Add(EMAIL_WORKER, NestedWorker.Instance); 
     } 
     _appState.UnLock(); 
    } 

    public static EmailWorker Instance { 
     get { 
      // TODO: If we haven't called Initialize() first then throw exception 
      return (EmailWorker)_appState[EMAIL_WORKER]; 
     } 
    } 
} 

Répondre

0

Il devrait être sûr pour les threads, mais pourquoi s'en soucier?

Un « standard » singleton sera également accessible sur l'ensemble de l'application, et elle ne nécessite pas l'injection et en gardant une référence au HttpApplicationState:

public sealed class EmailWorker 
{ 
    private EmailWorker() { } 

    private static class NestedWorker 
    { 
     static NestedWorker() { } 

     internal static readonly EmailWorker Instance = new EmailWorker(); 
    } 

    public static EmailWorker Instance 
    { 
     get { return NestedWorker.Instance; } 
    } 
} 
+0

Un éclaircissement. Je dois y accéder dans toutes les instances de l'application Web. La classe EmailWorker est un thread qui est démarré sur l'événement ApplicationStart. – robbymurphy

+1

@robby: Mais le 'HttpApplicationState' est seulement par application, exactement comme un singleton" standard ". – LukeH

+0

Est-ce parce que l'instance est statique? – robbymurphy

1

Vous n'avez pas besoin d'utiliser l'état d'application à tout.