相关资源下载最近做项目,一些页面需要加载大量的数据,有时候,我点击该页面,不等该页面加载完成,然后重新点击别的页面的时候
会出现很慢,网页加载中假死的状态,所以,今天就仔细研究下吧。
一开始,我以为是许多网站都会出现这种情况或者我电脑网速的问题,但是,我发现本站,并没有出现过这种情况,有时候,我发帖的时候会卡住,但是,我在选项卡点击其他的页面可以很快的加载出来。
今天仔细研究下吧!!!先上测试的代码:
首页view代码:
正常来讲,页面会直接输出Test2返回的内容,然后等待5秒输出Test1返回的内容,因为js是不阻塞的)
QQ截图20170922170306.jpg (76.43 KB, 下载次数: 374)
2017-9-22 17:24 上传
然后,我们直接访问Test1和Test2接口,我们先访问Test1,然后立马访问Test2,发现Test2必须等到Test1返回完成才会返回,如下图:
session.gif (134.94 KB, 下载次数: 324)
2017-9-22 17:25 上传
如果页面请求设置一个读取器锁定,同一会话中同时处理的其他请求将无法更新会话状态,但是至少可以进行读取。如果页面请求为会话状态设置一个写入锁,那么所有其他页面都被阻止,无论他们是否要读取或写入内容。例如,如果同时有两段程序视图在同一个Session中写入内容,一段程序必须等到另一段程序完成后才能写入。在AJAX程序设计中,必须注意这种情况的发生。
特别说明:只有写Session时,Asp.net才会阻塞请求,但是只要你访问过写Session的页面,比如是用Session登录的系统之后的操作(直到Session失效都一直锁定,当然只是SessionID相同的情况)。都会存在这个问题。
网友资料
只要网站使用了session,那么每次请求就会在整个生命周期中,锁住session,这样同一sessionid的请求就必须等待解锁
这就表示,如果网站有个超时的页面,那就什么事也干不了了,必须等这个超时的页面加载完成。
你同样干不了,同一页面多个ajax并发请求,干不了,消息轮询请求。
总结吧:如果,你带session去请求会出现这种情况,如果,你不带session去请求,不会出现上面情况
解决办法:
控制器 controller 增加 [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)] 特性
注意:
Required means you are requesting a exclusive lock on Session (i.e. no parallel processing of requests for the same sessionID)
ReadOnly means you are requesting a non-exclusive lock on Session (i.e. your request still has to wait for requests with an exclusive lock to finish, but you can process requests with non-exclusive locks in parallel. However it is up to you to ensure that your code doesn't write to Session. It's not necessarily enforced by the framework)Required意味着你请求的会话互斥锁(即没有并行处理为相同的SessionID的要求)
ReadOnly意味着你请求的会话非独占锁(即你的要求仍然要等待完成,独占锁的请求但你可以处理与并行非独占锁的请求。但是你要确保你的代码不写会话。它不一定是由框架的执行)