2010-10-20 2 views
0

У меня есть немного кода, который я пытался проверить на предмет безопасности потоков. Я использую базовую ленивую модель синглтона, найденную here. Мне было интересно, если он по-прежнему является потокобезопасным, если я помещаю экземпляр в объект HttpApplicationState. Мне нужно получить доступ к этому экземпляру во всех экземплярах веб-приложения, поэтому, если это не безопасно для потоков, как я могу сделать его потокобезопасным?Безопасность потоков экземпляра C# singleton в 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]; 
     } 
    } 
} 

ответ

0

Он должен быть потокобезопасным, но зачем беспокоиться?

A «стандарт» синглтон также будет доступен по всему приложению, и это не потребует инъекций и сохранения ссылки на 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

Немного разъяснений. Мне нужно получить к нему доступ во всех экземплярах веб-приложения. Класс EmailWorker - это поток, который запускается в событии ApplicationStart. – robbymurphy

+1

@robby: Но «HttpApplicationState» - это только одно приложение, точно такое же, как «стандартный» синглтон. – LukeH

+0

Это потому, что экземпляр является статическим? – robbymurphy

1

Вам не нужно использовать состояние приложения на все.

 Смежные вопросы

  • Нет связанных вопросов^_^