问题描述
第一次在CSDN上提问,请大牛们多关照啊背景描述:asp.net中,同一个会话(相同的SessionID)的不同请求,会由于Session锁机制产生阻塞问题,即如果两个请求都要修改Session的值,那么后到的请求要等前面的请求结束(锁释放)后才能访问到Session。但今天我发现了一个问题,首先贴测试代码:publicActionResultAbout(){Session["test"]="AboutMsg";ViewBag.Message=Session["test"].ToString()+"-"+Session.SessionID;returnView();}publicActionResultContact(){Session["test"]="ContactMsg";longj=0;for(longi=0;i<=1000000000;i++){j=i/100000*(i-1);}ViewBag.Message=Session["test"].ToString()+"-"+Session.SessionID;returnView();}
运行后在浏览器访问“Contact()”(设此次访问为A1),由于循环,此次请求需要执行十多秒。等待几秒后访问“About()”(设此次访问为B1),“About()”没有被阻塞,而是很快刷了出来,且页面上显示的是“AboutMsg”+SessionID。等待一会儿,Contact()中的循环结束,Contact()页面刷了出来,页面上显示“ContactMsg”+SessionID两个页面中显示的SessionID是完全一样的,如图所示,红框部分是输出的结果由此可见:A1的执行并没有阻塞B1,且此时它们是操作了同一个会话(SessionID相同),但A1中的Session["test"]的值却没有被B1影响。之后,再次访问“Contact()”(设此次访问为A2),“About()”(设此次访问为B2)。此时“About()”没有立即刷出来,而是等待十多秒后,“Contact()”“About()”同时刷了出来。问:1、B1为什么没被A1阻塞。2、为什么再次请求,B2就会被A2阻塞了。3、B1应该在A1的Session["test"]="ContactMsg";语句后开始执行,且执行完成,为什么A1的Session["test"]没有被改变。
解决方案
解决方案二:
A1的执行并没有阻塞B1,且此时它们是操作了同一个会话(SessionID相同)你这个测试场景本身有问题,你应该A1访问X秒钟才能得到结果,B1访问Y秒钟才能得到结果,然后两个请求一起发起,这时候你在F12里面就能看到某一个的请求一定是大于等于X+Y上次有个帖子也是说这个阻塞问题的,但一时间找不到
解决方案三:
引用1楼starfd的回复:
A1的执行并没有阻塞B1,且此时它们是操作了同一个会话(SessionID相同)你这个测试场景本身有问题,你应该A1访问X秒钟才能得到结果,B1访问Y秒钟才能得到结果,然后两个请求一起发起,这时候你在F12里面就能看到某一个的请求一定是大于等于X+Y上次有个帖子也是说这个阻塞问题的,但一时间找不到
呃,我已经尝试过很多次了。我的测试场景是:A1发起后,等待几秒后才发起B1(此时A1应该是在运行循环)。但结果都是:运行程序后的第一次操作,A1不会阻塞B1。紧接着再进行A2B2,A3B3,A4B4....等等操作,B操作都是会被阻塞的。如果测试场景有问题,我实在找不出问题在哪,还望告之。