欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net线程批量导入数据时通过ajax获取执行状态

程序员文章站 2022-08-27 16:07:06
前言 最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能。 通过线程执行...

前言

最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能。

通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过ajax调用session里的执行状态,从而实现反馈导入状态的功能!

上代码: 前端页面

<!doctype html>
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>批量导入数据</title>
 <style type="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: 10px 0; background: #fff; }
    .pop_body_con .pop_head a { display: block; color: #717274; font-size: 12px; text-decoration: none; text-align: center; }
  .pop_box { width: auto; overflow: hidden; padding: 45px 10px; }
   .pop_box .pop_text { float: left; }
    .pop_box .pop_text p { 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_con p { 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>
 <script src="ajax-master/jquery.js"></script>
 <script>
  var myinterval;

  $(function () {
   $("#startimport").click(function () {
    myinterval = setinterval(getstate, 1000);
   });
  });
  
  function getstate() {
   $.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)
      }
     }
    }
   });
  }

  function setprocessbar(exeflag, exemax) {
   $("#progressbar_text").html(parseint(roundfun(exeflag / exemax, 2) * 100) + "%");
   $("#progressbar_bar").attr("style", "width:" + parseint(roundfun(exeflag / exemax, 2) * 100) + "%;");
  }

  function roundfun(number, x) {
   x = (!x ? 2 : x);
   return math.round(number * math.pow(10, x)) / math.pow(10, x);
  }
 </script>
</head>
<body style="background-color: #fff;">
 <input id="startimport" type="button" value="导入数据" />
 <div id="loading-mask" ></div>
 <div class="pop_body_con">
  <div class="pop_head">
   <a href="javascript:;">正在导入…请勿操作!</a>
  </div>
  <div class="pop_box">
   <div class="pop_text">
    <p>导入进度:</p>
   </div>
   <div class="progress_bar_con">
    <p id="progressbar_text">0%</p>
    <div class="progress_bar_start"></div>
    <div class="progress_bar_end" id="progressbar_bar"></div>
   </div>
  </div>
 </div>
</body>
</html>

后台页面:

using system.linq;
using system.threading;
using system.web;
using system.web.script.serialization;
using system.web.ui;
using system.web.ui.webcontrols;

public partial class test : system.web.ui.page
{
 protected void page_load(object sender, eventargs e)
 {
  string action = request.form["action"];
  if (!string.isnullorempty(action))
  {
   hashtable temp = tmethod();
   if (temp == null)
   {
    thread trd = new thread(new parameterizedthreadstart(insertdata));
    trd.start(action);
   }
   else
   {
    if (temp["recode"].tostring() == "100")
    {
     
     session.remove("process");
    }
   }

   javascriptserializer ser = new javascriptserializer();
   string jsonstr = ser.serialize(temp);
   response.write(jsonstr);
   response.end();
  }
 }


 public hashtable tmethod()
 {
  return (hashtable)session["process"];
 }

 private void insertdata(object obj)
 {
  string action = obj.tostring();
  int tcount = 100;
  for (int i = 0; i < tcount; i++)
  {
   hashtable statehash = setstateval(0, i, tcount, action);
   session["process"] = statehash; //存入session,方便共享执行状态
   thread.sleep(500);
  }
  session["process"] = setstateval(100, tcount, tcount, action);
  thread.currentthread.abort();
 }

 private hashtable setstateval(int code, int beingv, int countv, string action)
 {
  hashtable statehash = new hashtable();
  statehash["recode"] = code; //返回状态值
  statehash["being"] = beingv;  //正在执行值
  statehash["count"] = countv;  //总值
  statehash["action"] = action;  //总值
  return statehash;
 }
}

ok,共享完毕!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。