问题是,是否有可能从多个线程执行同一会话的请求? ASP.NET中的方法是否可重入?特别是我们正在使用AJAX,这意味着正在进行异步请求。
这是否意味着将锁定放在会话内放置的对象的操作上?
我知道在处理静态和应用程序范围的变量时锁是必不可少的,但问题对于会话对象来说是一样的吗?
答案 0 :(得分:3)
ASP.NET通常每个请求使用一个线程。它可以使用多个线程,例如在提供asynchronous pages时,即使这样,在任何给定时间只有一个线程将处理该请求。
但是,从多个线程使用会话状态是安全的,因为会话对象的访问是序列化的。来自MSDN:
如果其他页面尝试怎么办? 同时访问会话状态? 在那种情况下,当前的请求 可能最终会出现不一致的问题 数据或不是最新的数据。 只是为了避免这种情况,会话状态 模块实现了一个读/写器 锁定机制和队列 访问状态值。一页 具有会话状态写访问权限 在会话上持有作家锁 直到请求终止。
答案 1 :(得分:2)
问题是,是否可能从多个线程执行同一会话的请求?
如果在页面中使用HTTP Session,则ASP.NET引擎将对同一会话的请求进行排队。它们永远不会并行运行。因此,例如,如果您向使用会话的某个ASP.NET页面发送多个AJAX请求,那么这些请求将按顺序执行。
如果您不使用Session,那么多个并发请求将并行运行。