文章插图
最近在写Webform页面程序发现这样一个现象:在做导出功能时 , 由于导出数据的处理时间比较长 , 就在客户端加一个定时器通过ajax不间断查询导出进度 。然后发现了一个情况 , 这个请求一直是阻塞的状态 , 直到导出事件处理完成之后 。才去执行这个请求 , 也就是说如果响应时间长的请求还在进行中 , 短的请求却被挂起了 。
百度了下 , 最终确定是Asp.Net Session造成的 。原文:https://www.cnblogs.com/littlewrong/p/4783104.html
原理:Session实现了Reader/Writer的锁机制:
当页面对Session具有可写功能(即页面有<%@Page EnableSessionState=”True” %>标记) , 此时直到请求完成该页面的Session持有一个写锁定 。
当页面对Session具有只读功能(即页面有<%@Page EnableSessionState=”ReadOnly” %>标记) , 此时知道请求完成该页面的Session持有一个读锁定 。
读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定 。这就是为什么两个框架中的同一个页面都去写同一个Session时 , 其中一个要等待另一个(稍快的那个)完成后 , 才开始写 。
“写锁定将阻塞所有的读写锁定” , 也就是说页面在EnableSessionState=”True”的情况下没返回输出时 , 一直持着Session写操作 , 其他页面对Session的读操作必须等待 , 而asp.net的aspx页面默认是EnableSessionState=”True” , 每个页面从请求开始至返回一直持着Session写操作 , 需验证页面必须读取Session值判断 , 这就是为什么需验证的页面请求被阻塞的原因 。只要耗时页面(A页面)没有Session的写操作 , 也就不会阻塞其他页面的请求 , 于是修改A页面的EnableSessionState=”ReadOnly” , 例如:<%@ Page Language=”C#” AutoEventWireup=”true”CodeFile=”TBS_Monitor_List.aspx.cs”EnableSessionState=”ReadOnly” Inherits=”TBS_Monitor_List” %> , 问题解决 。
结论:也就是说 , 在无需对session进行写操作的页面 , 在Page指令加上EnableSessionState=”ReadOnly”属性 , 就不会造成Request阻塞的情况了 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 快递停滞投诉快速解决办法 快递停滞几天可以投诉
- tomcat网页404错误解决 tomcat启动404错误
- 晕车有什么方法能解决 晕车的解决方法
- mac电池检测灯不亮解决方案 mac电池检测灯不亮
- 电脑蓝屏,有大神知道是什么问题吗,这是什么故障又如何解决?
- U盘插到电脑上不显示该如何处理?电脑读不出u盘解决方法
- 为什么电脑开机内存就占用2000多M,怎么样快速解决
- office2007错误1935解决办法 office安装错误1935怎么办
- office2010提示安装出错的解决方法 office2010安装出错是怎么回事
- centos安装图形界面后无法进入解决方案 centos安装图形界面后无法进入