这个"单身"在ASP.NET应用程序中是线程安全的吗?

时间:2012-01-10 16:34:19

标签: c# asp.net singleton session-state

请注意,“singleton”在稍微不常见的意义上使用 - “对象像HttpContext.Current一样可见”,与普通的“具有一个共享实例的对象”不同。

我为我的asp.net MVC应用程序使用单例类型的UserContext类。该类允许我将用户数据存储为强类型会话对象。我跑过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为我管理?

2 个答案:

答案 0 :(得分:2)

访问Session已经是线程安全的。

通常,只要您以线程安全的方式访问静态属性中的任何共享状态,就不会有任何问题。

答案 1 :(得分:1)

ASP会话状态带有同步逻辑。 如果执行的页面需要对会话状态的写访问权,则会话状态被锁定,并且同一会话上的其他请求必须等到第一个请求完成。

请参阅Synchronizing Access to the Session State