背景
一直没有意识到会话的访问会导致会话锁定,现在想想这样设计是非常合理的,不过某些情况下这样会导致同一个会话的并发访问非常低(只能串行化),好在MS提供了机制让我们控制这种锁。
测试
A页面:缓存写入页面
1 public partial class Session_Lock_Test : System.Web.UI.Page 2 { 3 protected void Page_Load(object sender, EventArgs e) 4 { 5 this.Session["Data"] = DateTime.Now; 6 7 this.Response.Write(this.Session["Data"]); 8 } 9 }
B页面:缓存读取页面(长时间)
1 public partial class Session_Lock_Read_Long_Test : System.Web.UI.Page 2 { 3 protected void Page_Load(object sender, EventArgs e) 4 { 5 System.Threading.Thread.Sleep(5000); 6 7 this.Response.Write(this.Session["Data"].ToString() + DateTime.Now.Millisecond); 8 } 9 }
C页面:缓存读取页面(短时间)
1 public partial class Session_Lock_Read_Short_Test : System.Web.UI.Page 2 { 3 protected void Page_Load(object sender, EventArgs e) 4 { 5 this.Response.Write(this.Session["Data"].ToString() + DateTime.Now.Millisecond); 6 } 7 }
默认的情况下,如果我们先打开B,再打开C,会发现C始终在B之后显示。
如果修改为并行访问呢?
在WebForm中可以这样修改:
1 <%@ Page Language="C#" AutoEventWireup="true" EnableSessionState="ReadOnly" CodeBehind="Session_Lock_Read_Long_Test.aspx.cs" Inherits="WebFormStudy.Session_Lock_Read_Long_Test" %>
在Mvc中的可以这样修改:
1 [SessionState(SessionStateBehavior.ReadOnly)]
备注
因为IIS Express被我弄坏了,没法贴截图了。
参考资料:http://msdn.microsoft.com/zh-cn/library/ms178587(v=vs.100).aspx。