zoukankan      html  css  js  c++  java
  • 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 { 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", "" + 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,共享完毕!

     原文链接:http://www.cnblogs.com/LittleBai/p/6179183.html

    交流群:225443677 

  • 相关阅读:
    27 Spring Cloud Feign整合Hystrix实现容错处理
    26 Spring Cloud使用Hystrix实现容错处理
    25 Spring Cloud Hystrix缓存与合并请求
    24 Spring Cloud Hystrix资源隔离策略(线程、信号量)
    23 Spring Cloud Hystrix(熔断器)介绍及使用
    22 Spring Cloud Feign的自定义配置及使用
    21 Spring Cloud使用Feign调用服务接口
    20 Spring Cloud Ribbon配置详解
    19 Spring Cloud Ribbon自定义负载均衡策略
    18 Spring Cloud Ribbon负载均衡策略介绍
  • 原文地址:https://www.cnblogs.com/LittleBai/p/6179183.html
Copyright © 2011-2022 走看看