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


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

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

    上代码: 前端页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <title>批量导入数据</title>
     <style type="text/css">
      .pop_body_con { 310px; position: fixed; top: 50%; left: 50%; margin-left: -150px; background: #eee; display:none; }
       .pop_body_con .pop_head { 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 { 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; 220px; position: relative; z-index: 2; }
        .pop_box .progress_bar_con p { margin: 0; padding: 0; font-size: 12px; color: #fff; line-height: 18px; 100%;
                text-align: center; position: absolute; left: 0; top: 0; z-index: 4; }
        .pop_box .progress_bar_con .progress_bar_start { 100%; height: 18px; background: #C4C0C0; }
        .pop_box .progress_bar_con .progress_bar_end { 16%; height: 18px; background: #2bd35d; position: absolute; left: 0; top: 0; z-index: 3; }
       .pop_box .progress_bar_con { float: left; }
      #loading-mask { 100%; height: 100%; position: fixed; top: 0px; left: 0px; z-index: 0; 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", "" + 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="">
     <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>
     
    后台
    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;
     }
    }
  • 相关阅读:
    mislider jQuery响应式圆形图片轮播图特效制作(图片轮播效果二)
    CSS3 animation实现图片轮播效果 自动显示 无需使用js 含代码(图片轮播效果一)
    HTML5 Canvas 学习笔记(canvas绘制线条、矩形、多边形、圆、自定义图像)
    网页右侧悬浮窗制作
    用JavaScript实现选项卡功能
    XML 可扩展的标记性语言
    继承
    原型和原型链
    HTTP 协议类
    DOM 事件
  • 原文地址:https://www.cnblogs.com/sjqq/p/6362482.html
Copyright © 2020-2023  润新知