C# 这是否应该";“单身人士”;在ASP.NET应用程序中是线程安全的吗?

C# 这是否应该";“单身人士”;在ASP.NET应用程序中是线程安全的吗?,c#,asp.net,singleton,session-state,C#,Asp.net,Singleton,Session State,请注意,“singleton”的用法有点不寻常——“对象可视为单个实例,如HttpContext.Current”与“普通”对象不同,只有一个共享实例” 我为我的asp.net MVC应用程序使用了一个单一类型的UserContext类。此类允许我将用户数据存储为强类型会话对象。我偶然发现并想知道在这个应用程序上下文中是否有必要关注线程安全 以下是我的代码的简化: public class UserContext { private UserContext() { }

请注意,“singleton”的用法有点不寻常——“对象可视为单个实例,如HttpContext.Current”与“普通”对象不同,只有一个共享实例”

我为我的asp.net MVC应用程序使用了一个单一类型的
UserContext
类。此类允许我将用户数据存储为强类型会话对象。我偶然发现并想知道在这个应用程序上下文中是否有必要关注线程安全

以下是我的代码的简化:

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为我管理该模型?

访问
会话
已经是线程安全的


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

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


请参阅。

您的样本中的“singleton”在哪里?代码是合理的,但对象不是任何通常意义上的“单例”(具有一个实例的对象)。。。如果真的用作singleton,那将是一个巨大的问题。是的,在标题中包含“singleton”一词之前,我实际上停顿了一下,但我没有更有效的方法来描述它。在会话上下文中,它是一个单例,但您是对的,它不是一个应用程序范围的单例。我的问题更多的是关于线程是如何处理的,以及这是否会带来问题。