【发布时间】:2011-10-24 04:36:28
【问题描述】:
考虑一个用户同时发出多个请求,我是否必须锁定所有与 Session 一起工作的代码?
例如,如果我有以下场景,用户在浏览器的一个选项卡中打开一个页面,然后在第二个选项卡中退出。
请求 1:
if(Session["user"] != null)
lblName.Text = Session["user"].Name;
请求 2:
if(logout)
Session["user"] = null;
请求 1 在访问 Name 属性时是否可能引发 NullPointerException?我是否需要锁定请求 1 中的代码,以确保在检查 null 后用户仍然存在?还是 ASP.NET 会以某种方式自动处理这个问题?
【问题讨论】:
-
我会传递参考信息,对吧?如果 Request2 调用 Session["user"].Dispose() 会怎样?这会影响我在 Request1 中退出 Session 的用户吗?
-
是的,在这种情况下,您可以使用已处置的对象。
-
Peter Ruderman 的回答说它在请求 1 中不能为空。两种意见 - 什么是正确的?
-
@atticae:这取决于您使用的是内存还是基于 SQL 的会话状态。在任何情况下,您都应该假设该对象可以在多个线程之间共享并适当地同步访问。
-
@Darryl Braaten:请求 1 中没有竞争条件,因为 ASP.NET 在 Session 上使用读取器和写入器锁。请阅读msdn.microsoft.com/en-us/library/aa479041.aspx
标签: c# asp.net session thread-safety