最近在做一个asp.net实时进度条遇到的问题
function importExcel() {
if (!checkForm()) {
return false;
}
$.ajax({
url: "/API/BackProcess.ashx",
type: "POST",
dataType: "json",
data: {
action: "ImportExcel",
excelFilePath:$("#ctl00_contentHolder_fpExcel").val(),
cusType: $("#ddlCusType").val(),
relateID: $("#ddlRelation").val(),
state: $("#ddlStatu").val(),
fromUserID: $("#ctl00_contentHolder_hmSelect_hfUserID").val(),
},
success: function (info) {
if (info.success) {
}
else {
ShowMsg(info.ErrMsg, false);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
closeBg();
ShowMsg("错误信息:" + errorThrown, false);
}
});
setTimeout(getProgress(),20);
}
function getProgress() {
alert("bbbbb");
$.ajax({
url: "/API/BackProcess.ashx",
type: "POST",
data: { action: "GetProgress" },
success: function (width) {
if (width != "-1") {
//工作没有结束,继续查询进度
//setTimeout(getProgress(), 20);
$("#progressbar").css("width", width + "%");
$("#progressbar").text(width + "%");
} else {
//工作完成
$("#progressbar").css("width", "100%");
$("#progressbar").text("100%");
}
}
});
}
上述两个$.ajax,其中 importExcel()方法为主方法,后台for循环录入数据把变量存到Session中,getProgress()为获取Session变量更新进度条。按道理说,两个$.ajax都为异步,在后台执行importExcel()方法的for循环时,getProgress()方法的后台代码应该也在执行才对。而现在必须等到主方法的for循环先执行完才会执行获取Session的方法。每次获取到的变量都是100%意味着都是等数据录入完了再去更新进度条,这样实时进度条就完全失去意义。
查了一些资料有大神说可能是session独占或是ajax要设置异步的问题,这些我都做了检查,哪怕是for循环里不涉及任何Session的操作依然是要等到主方法执行完才能执行获取进度的方法。
还请各位大神指点迷津 谢谢。
对的,Session锁定了,不管你客户端怎么开线程,都得等服务器端挨个执行。
这么说吧,你去写个函数,里面lock起来,然后开两个线程,你看看lock里面能不能同时执行 —— 就是这个道理。
并行和串行慢慢理解。
举个例,打饭;
两个同学(client)并发打饭,虽然小二(service)有多个,但是瓢儿(session)只有一个;
@花飘水流兮: 谢谢大神啊,那个Session的问题我有注意到的,我后面把Session赋值和取值的操作代码都删掉了只剩下for循环里面其他的内容,不涉及任何Session操作依然是主方法先执行,执行完之后才执行获取进度的方法。两个ajax都是设置异步的。
ajax支持onprogress事件,如果你的版本不支持,可看下面的这个
http://www.dave-bond.com/blog/2010/01/JQuery-ajax-progress-HMTL5/