我刚刚发现 ASP.Net Web 应用程序中的每个请求都会在请求开始时获取会话锁,然后在请求结束时释放它!
如果您像我一开始一样不明白这其中的含义,那么这基本上意味着以下内容:
-
任何时候 ASP.Net 网页需要很长时间才能加载(可能是由于数据库调用缓慢或其他原因),并且用户决定导航到不同的页面,因为他们厌倦了等待,他们不能!ASP.Net 会话锁强制新页面请求等待,直到原始请求完成其极其缓慢的加载。呃。
-
任何时候UpdatePanel
加载缓慢,用户决定在加载之前导航到不同的页面UpdatePanel
已经更新完毕...他们不能!ASP.Net 会话锁强制新页面请求等待,直到原始请求完成其极其缓慢的加载。双啊啊!
那么有哪些选择呢?到目前为止我已经想出了:
- 实施定制
SessionStateDataStore
,ASP.Net 支持。我还没有找到太多可以复制的东西,而且这似乎风险很高,而且很容易搞砸。
- 跟踪所有正在进行的请求,如果请求来自同一用户,则取消原始请求。看起来有点极端,但它会起作用(我认为)。
- 不要使用会话!当我需要用户某种状态时,我可以使用
Cache
相反,以及经过身份验证的用户名上的关键项目或类似的东西。再次显得有些极端。
我实在不敢相信ASP.Net微软团队会在4.0版本的框架中留下如此巨大的性能瓶颈!我错过了一些明显的东西吗?使用一个有多难ThreadSafe
会议的集合?
如果您的页面没有修改任何会话变量,您可以选择退出大部分这种锁定。
<% @Page EnableSessionState="ReadOnly" %>
如果您的页面不读取任何会话变量,您可以选择对该页面完全退出此锁定。
<% @Page EnableSessionState="False" %>
如果您的页面没有使用会话变量,只需在 web.config 中关闭会话状态即可。
<sessionState mode="Off" />
我很好奇,如果不使用锁,您认为“ThreadSafe 集合”会如何实现线程安全?
编辑:我可能应该解释一下“选择退出大部分锁定”的含义。可以同时为给定会话处理任意数量的只读会话或无会话页面,而不会相互阻塞。但是,读写会话页面在所有只读请求完成之前无法开始处理,并且在运行时它必须具有对该用户会话的独占访问权限以保持一致性。锁定单个值是行不通的,因为如果一个页面将一组相关值作为一个组进行更改怎么办?您如何确保同时运行的其他页面能够获得用户会话变量的一致视图?
如果可能的话,我建议您在设置会话变量后尽量减少对它们的修改。这将允许您将大部分页面设为只读会话页面,从而增加来自同一用户的多个同时请求不会相互阻塞的机会。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)