这个“单例”应该在ASP.NET应用程序中是线程安全的吗?
请注意,“singleton”在稍微不常见的意义上使用 – “对象像HttpContext.Current一样可见”,与普通的“具有一个共享实例的对象”不同。
我为我的asp.net MVC应用程序使用单例类型的UserContext
类。 此类允许我将用户数据存储为强类型会话对象。 我遇到了这个CodeReview问题,并想知道是否有必要关注此应用程序上下文中的线程安全性。
这是我的代码的简化:
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为我管理?
访问Session
已经是Thread安全的。
通常,只要您以线程安全的方式访问静态属性中的任何共享状态,就不会有任何问题。
ASP会话状态带有同步逻辑。 如果执行的页面需要对会话状态的写访问权,则会话状态被锁定,并且同一会话上的其他请求必须等到第一个请求完成。
请参阅同步对会话状态的访问 。
上述就是C#学习教程:这个“单例”应该在ASP.NET应用程序中是线程安全的吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/953941.html