【问题标题】:What are the lock-free sessions in C#?C# 中的无锁会话是什么?
【发布时间】:2015-03-13 11:36:52
【问题描述】:

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

【问题讨论】:

标签: c# asp.net session


【解决方案1】:

这是来自msdn部分Concurrent Request and Session State的一些内容

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

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

注意:当您将 EnableSessionState 指定为 ReadOnly 时。 asp.net 不会在 session 上获得任何排他锁,最终它也会使 session 对该页面只读。

这是关于另一个堆栈溢出线程上的 asp.net 中的会话锁的很好的讨论:- link

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好的,什么是无锁会话?
    猜你喜欢
    • 2011-01-17
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2011-10-27
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多