正在使用Session线程安全吗?

时间:2011-08-10 15:06:12

标签: c# asp.net session thread-safety

考虑用户同时发出多个请求,是否必须锁定与Session一起使用的所有代码?

例如,如果我有以下情况,在浏览器的一个标签中,用户打开一个页面,在第二个标签中,他会退出。

请求1:

if(Session["user"] != null)
    lblName.Text = Session["user"].Name;

请求2:

if(logout)
   Session["user"] = null;

在访问Name属性时,Request 1是否可能抛出NullPointerException?我是否需要锁定请求1中的代码,以确保用户在检查null后仍然存在?或者ASP.NET是否以某种方式自动处理?

4 个答案:

答案 0 :(得分:14)

对于同一会话的ASP.NET应用程序的两个请求,其中处理程序不使用IReadOnlySessionState标记接口或为您的页面打开EnableSessionState="ReadOnly",将被序列化ASP.NET运行时保证状态的一致性。因此,如果您有两个能够写入会话状态的页面,无论客户端做什么,它们都将被串行访问。

您的应用程序代码可以通过上述技术向ASP.NET发送信号,无论页面/处理程序是否要写入会话状态。如果不这样做,所有请求都将被序列化,并且Web应用程序的性能将受到影响。

答案 1 :(得分:9)

与往常一样,答案取决于“安全”的含义。在ASP .NET中,每个请求都可以独占访问其会话状态。这意味着您不必担心在单个请求的范围内同步访问。如果Session [“user”]为非null,则在当前请求的整个持续时间内它将为非null。在您的示例中,请求1将永远不会抛出空引用异常。

答案 2 :(得分:4)

在ASP.NET中,Session module uses a pair of reader/writer locks per session,因此请求1将具有一致的读取,并且请求2将阻塞,直到请求1完成。

答案 3 :(得分:1)

是的,Session是线程安全的。

无需锁定任何内容。但是,检查值的必要性永远不会是必不可少的。

<强>更新

检查@Peter Ruderman的回答:)

我将不得不复制它:)