Потокобезопасность экземпляра синглтона C # в ApplicationState - PullRequest
0 голосов
/ 21 октября 2010

У меня есть немного кода, который я пытался проверить на безопасность потоков. Я использую базовую ленивую модель синглтона, найденную здесь . Мне было интересно, если это все еще потокобезопасно, если я помещаю экземпляр в объект HttpApplicationState. Мне нужно получить доступ к этому экземпляру во всех экземплярах веб-приложения, поэтому, если это не потокобезопасно, как я могу сделать его потокобезопасным?


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];
        }
    }
}

Ответы [ 2 ]

1 голос
/ 21 октября 2010

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

0 голосов
/ 21 октября 2010

Это должно быть поточно-ориентированным, но зачем?

«Стандартный» синглтон также будет доступен во всем приложении, и для него не потребуется вводить и хранить ссылку на 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; }
    }
}
...