asp.net线程批量导入数据时通过ajax获取执行状态
前言
最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能。
通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过ajax调用session里的执行状态,从而实现反馈导入状态的功能!
上代码:前端页面
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>批量导入数据</title>
<styletype="text/css">
.pop_body_con{width:310px;position:fixed;top:50%;left:50%;margin-left:-150px;background:#eee;display:none;}
.pop_body_con.pop_head{width:auto;padding:10px0;background:#fff;}
.pop_body_con.pop_heada{display:block;color:#717274;font-size:12px;text-decoration:none;text-align:center;}
.pop_box{width:auto;overflow:hidden;padding:45px10px;}
.pop_box.pop_text{float:left;}
.pop_box.pop_textp{padding:0;margin:0;font-size:12px;line-height:18px;color:#717274;}
.pop_box.progress_bar_con{float:left;width:220px;position:relative;z-index:2;}
.pop_box.progress_bar_conp{margin:0;padding:0;font-size:12px;color:#fff;line-height:18px;width:100%;
text-align:center;position:absolute;left:0;top:0;z-index:4;}
.pop_box.progress_bar_con.progress_bar_start{width:100%;height:18px;background:#C4C0C0;}
.pop_box.progress_bar_con.progress_bar_end{width:16%;height:18px;background:#2bd35d;position:absolute;left:0;top:0;z-index:3;}
.pop_box.progress_bar_con{float:left;}
#loading-mask{width:100%;height:100%;position:fixed;top:0px;left:0px;z-index:0;background-color:rgba(0,0,0,0.34902);display:none;}
</style>
<scriptsrc="ajax-master/jquery.js"></script>
<script>
varMyInterval;
$(function(){
$("#startImport").click(function(){
MyInterval=setInterval(getState,1000);
});
});
functiongetState(){
$.ajax({
url:"test.aspx",
type:"Post",
data:{action:"getSession"},
success:function(msg){
if(msg!="null"){
msg=eval('('+msg+')');
if(msg.being==100){
setProcessBar(1,1);
$(".pop_body_con").hide();
$("#loading-mask").hide();
clearInterval(MyInterval);
}
else{
$(".pop_body_con").show();
$("#loading-mask").show();
setProcessBar(msg.being,msg.count)
}
}
}
});
}
functionsetProcessBar(exeFlag,exeMax){
$("#progressbar_text").html(parseInt(roundFun(exeFlag/exeMax,2)*100)+"%");
$("#progressbar_bar").attr("style","width:"+parseInt(roundFun(exeFlag/exeMax,2)*100)+"%;");
}
functionroundFun(number,X){
X=(!X?2:X);
returnMath.round(number*Math.pow(10,X))/Math.pow(10,X);
}
</script>
</head>
<bodystyle="background-color:#fff;">
<inputid="startImport"type="button"value="导入数据"/>
<divid="loading-mask"></div>
<divclass="pop_body_con">
<divclass="pop_head">
<ahref="javascript:;">正在导入…请勿操作!</a>
</div>
<divclass="pop_box">
<divclass="pop_text">
<p>导入进度:</p>
</div>
<divclass="progress_bar_con">
<pid="progressbar_text">0%</p>
<divclass="progress_bar_start"></div>
<divclass="progress_bar_end"id="progressbar_bar"></div>
</div>
</div>
</div>
</body>
</html>
后台页面:
usingSystem.Linq;
usingSystem.Threading;
usingSystem.Web;
usingSystem.Web.Script.Serialization;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
publicpartialclasstest:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
stringaction=Request.Form["action"];
if(!string.IsNullOrEmpty(action))
{
Hashtabletemp=tmethod();
if(temp==null)
{
Threadtrd=newThread(newParameterizedThreadStart(insertData));
trd.Start(action);
}
else
{
if(temp["reCode"].ToString()=="100")
{
Session.Remove("process");
}
}
JavaScriptSerializerser=newJavaScriptSerializer();
StringjsonStr=ser.Serialize(temp);
Response.Write(jsonStr);
Response.End();
}
}
publicHashtabletmethod()
{
return(Hashtable)Session["process"];
}
privatevoidinsertData(objectobj)
{
stringaction=obj.ToString();
inttCount=100;
for(inti=0;i<tCount;i++)
{
HashtablestateHash=setStateVal(0,i,tCount,action);
Session["process"]=stateHash;//存入session,方便共享执行状态
Thread.Sleep(500);
}
Session["process"]=setStateVal(100,tCount,tCount,action);
Thread.CurrentThread.Abort();
}
privateHashtablesetStateVal(intcode,intbeingV,intCountV,stringaction)
{
HashtablestateHash=newHashtable();
stateHash["reCode"]=code;//返回状态值
stateHash["being"]=beingV;//正在执行值
stateHash["count"]=CountV;//总值
stateHash["action"]=action;//总值
returnstateHash;
}
}
ok,共享完毕!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。