请注意,“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为我管理?
答案 0 :(得分:2)
访问Session
已经是线程安全的。
通常,只要您以线程安全的方式访问静态属性中的任何共享状态,就不会有任何问题。
答案 1 :(得分:1)
ASP会话状态带有同步逻辑。 如果执行的页面需要对会话状态的写访问权,则会话状态被锁定,并且同一会话上的其他请求必须等到第一个请求完成。