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,共享完毕!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。