我正在构建一个Javascript应用程序,并且eash用户有一个单独的UserSession。该应用程序进行了一堆Ajax调用。每个Ajax调用都需要访问用户的单个UserSession对象。同步访问ASP.NET会话的成员
每个Ajax调用都需要一个UserSession对象。
UserSession对象中的数据对每个用户都是唯一的。
本来,每个Ajax调用期间,我将创建一个新UserSession对象和它的数据成员被存储在ASP.NET会话。但是,我发现UserSession对象正在被实例化。为了最大限度地减少UserSession对象的构造,我将它封装在Singleton模式中,并对其进行同步访问。
我相信同步发生在应用程序范围内,但我只需要它发生在每个用户。我在这里看到一篇文章说ASP.NET缓存是同步的,但是创建对象并将其插入到缓存中的时间另一个线程可以开始构建另一个对象并将其插入缓存。
这是我目前正在同步访问对象的方式。有没有比使用“锁定”更好的方法...应该锁定HttpContext.Session对象?
private static object SessionLock = new object();
public static WebSession GetSession
{
get
{
lock (SessionLock)
{
try
{
var context = HttpContext.Current;
WebSession result = null;
if (context.Session["MySession"] == null)
{
result = new WebSession(context);
context.Session["MySession"] = result;
}
else
{
result = (WebSession)context.Session["MySession"];
}
return result;
}
catch (Exception ex)
{
ex.Handle();
return null;
}
}
}
}
为什么你需要一个单例模式?您已经在使用直接映射到您自己的会话对象的作用域/使用的会话状态对象。 – kervin 2010-04-26 17:44:57
我希望同一个用户同时有多个请求。 – Sam 2010-04-26 19:03:53