同步访问ASP.NET会话的成员

Sam*_*Sam 4 c# asp.net synchronization

我正在构建一个Javascript应用程序,而eash用户有一个单独的UserSession.该应用程序进行了一堆Ajax调用.每个Ajax调用都需要访问用户的单个UserSession对象.

  1. 每个Ajax调用都需要一个UserSession对象.

  2. UserSession对象中的数据对每个用户都是唯一的.

最初,在每次Ajax调用期间,我将创建一个新的UserSession对象,并将其数据成员存储在ASP.NET Session中.但是,我发现UserSession对象正在被实例化很多.为了最小化UserSession对象的构造,我将它包装在Singleton模式中并对其进行同步访问.

我相信同步正在应用程序范围内发生,但我只需要每个用户发生这种情况.我在这里看到一篇帖子说ASP.NET缓存是同步的,但是创建对象并将其插入缓存之间的时间另一个Thread可以开始构建它的另一个对象并将其插入缓存中.

这是我正在同步访问对象的方式.有没有比使用"lock"更好的方法...应该锁定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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ker*_*vin 7

您不需要锁定会话状态访问权限.

会话状态的物理值在完成请求所需的时间内被锁定.锁由HTTP模块在内部管理,用于同步对会话状态的访问.

http://msdn.microsoft.com/en-us/library/aa479041.aspx