2012-01-10 6 views
3

Обратите внимание, что «singleton» используется в немного необычном смысле - «объект, видимый как один экземпляр, такой как HttpContext.Current« в отличие от обычного »объекта с одним общим экземпляром».Должен ли этот «singleton» быть потокобезопасным в приложении ASP.NET?

Я использую одноэлементный тип класса UserContext для приложений asp.net MVC. Этот класс позволяет хранить пользовательские данные в виде строго типизированного объекта сеанса. Я столкнулся с this CodeReview question и задался вопросом, нужно ли беспокоиться о безопасности потоков в этом контексте приложения.

Вот упрощение моего кода:

public class UserContext 
{ 
    private UserContext() 
    { 
    } 

    public static UserContext Current 
    { 
     get 
     { 
      if (HttpContext.Current.Session["UserContext"] == null) 
       BuildUserContext(); 

      return (UserContext)HttpContext.Current.Session["UserContext"]; 
     } 
    } 

    private static void BuildUserContext() 
    { 
     if (!user.Identity.IsAuthenticated) return; 

     var uc = new UserContext { IsAuthenticated = true }; 

     // ...snip... 
     // Set up user data 

     // Save it into the session 
     HttpContext.Current.Session["UserContext"] = uc; 
    } 


    #region Class members 
    public bool IsAuthenticated { get; internal set; } 
    public string Name { get; internal set; } 
    // ...snip... 
    // Other properties 

    public void Refresh() 
    { 
     BuildUserContext(); 
    } 

    public void Flush() 
    { 
     HttpContext.Current.Session["UserContext"] = null; 
    } 
    #endregion 
} 

У меня не было никаких проблем, блокирующие до сих пор, но сейчас сайт не очень высокий трафик. Должен ли я принять нитевидную модель Jon Skeet или IIS справится с этим для меня?

+0

Где находится "singleton" в вашем примере? Код является разумным, но объект не является «одноэлементным» в любом обычном смысле (объект с одним экземпляром - http://en.wikipedia.org/wiki/Singleton_pattern) ... Было бы огромной проблемой, если бы фактически использовалось как singleton. –

+0

Да, я на самом деле остановился, прежде чем включать слово «singleton» в названии, но у меня не было более эффективного способа его описания. В контексте сеанса это синглтон, но вы правы, это не одноэлементная область приложения. Мой вопрос о том, как обрабатывать потоки и может ли это возникнуть проблема. –

ответ

2

Доступ к Session уже относится к теме.

Как правило, до тех пор, пока вы получаете доступ к любому общему состоянию в ваших статических свойствах в потокобезопасном режиме, у вас не будет никаких проблем.

1

Состояние сеанса ASP имеет логику синхронизации. Если исполняемая страница нуждается в доступе на запись в состояние сеанса, состояние сеанса заблокировано, а другой запрос на том же сеансе должен дождаться завершения первого.

См. Synchronizing Access to the Session State.

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