C#中的无锁会话是什么?

时间:2015-01-15 05:25:11

标签: c# asp.net session

我知道C#中的会话以及如何定义它们。但是今天我听到了无锁会话这个词。我用Google搜索,但没有得到任何与我的问题完全匹配的答案。任何人都可以解释一下C#中的无锁会话以及如何为它们编写代码吗?

2 个答案:

答案 0 :(得分:3)

以下是msdn部分Concurrent Request and Session State

中的部分内容
  
    

对每个会话的访问ASP.NET会话状态是独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果对同一会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。 (如果由于第一个请求超过锁定超时而释放信息的独占锁定,则第二个会话也可以访问。)如果@ Page指令中的EnableSessionState值设置为ReadOnly,则只读请求会话信息不会导致会话数据的独占锁定。但是,会话数据的只读请求可能仍然需要等待会话数据的读写请求设置的锁定才能清除。

  

因此,只要并发请求带有相同的sessionId,它就会进入独占锁。要创建无锁会话,您只需按照上述MSDN文档将EnableSessionState设置为ReadOnly即可。这称为无锁会话

注意:将EnableSessionState指定为ReadOnly时。 asp.net不会获得会话的任何独占锁定,最终它也会将该会话作为该页面的只读。

这是关于另一个Stack溢出线程中asp.net中会话锁的非常好的讨论: - link

答案 1 :(得分:1)

会话状态模块 实现 readers – writers locking mechanism ,并对访问会话状态值进行排队。具有会话状态写访问权限的页面将在会话上保持写入程序锁定,直到请求完成。通过将EnableSessionState指令上的@Page属性设置为True,页面将获得对会话状态的写访问权。具有会话状态读取访问权限的页面(例如,当EnableSessionState属性设置为ReadOnly时 - 将在会话结束时保持会话读取器锁定。