在论坛上查问题时候偶然看到一个线程session的问题...感觉很不错..记下来,以后碰到可以处理
转载的论坛地址:http://bbs.csdn.net/topics/320036394
之前遇到一个问题。
于是做了以下实验:
页面加载后,提交一个Ajax请求(暂称为ajax1),请求的线程在服务器上被睡眠10秒钟。
点击页面上一个button,触发另一个Ajax请求(ajax2)。
当没有使用session,在服务器未处理完ajax1的请求时,服务器依然可以处理ajax2的请求。
但是,当使用了session,在服务器未处理完ajax1的请求时,服务器不能处理ajax2的请求。必须等到ajax1处理完成后,才能处理ajax2的请求。
使用session的代码很简单,Session.Add("user", "aaa");
求教牛人,如何在使用了session后,当ajax1未处理完成时,依然可以处理ajax2的请求? <div class="social-share">
代码:
<code class="csharp keyword"></code></div>
代码:
protected void Page_Load(object sender, EventArgs e)
{
//使用session的代码
Session.Add("user", "aaa");
switch (Request.QueryString["action"])
{
case "ajax1":
Thread.Sleep(8000);
Response.Clear();
Response.Write("alert('ajax1');");
Response.End();
break;
case "ajax2":
Response.Clear();
Response.Write("alert('ajax2');");
Response.End();
break;
}
}
function myXmlHttp(){}
myXmlHttp.prototype.sendXmlHttp=
function(url,data,fun){
var xmlHttp;
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
xmlHttp.open("POST", url, true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
if (xmlHttp.responsetext != "") {
if(fun !=""&&fun !=undefined)
{
fun(xmlHttp.responsetext);
}
}
}
}
};
xmlHttp.send(data);
}
<pre name="code" class="html">Session实现了Reader/Writer的锁机制:
当页面对Session具有可写功能(即页面有<%@ Page EnableSessionState="True" %>标记),此时直到请求完成该页面的Session持有一个写锁定。
当页面对Session具有只读功能(即页面有<%@ Page EnableSessionState="ReadOnly" %>标记),此时知道请求完成该页面的Session持有一个读锁定。
读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么ajax1,ajax2都去写同一个Session时,ajax2要等待ajax1完成后,才开始写。
加一个EnableSessionState="ReadOnly" 搞定