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", "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,共享完毕!

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

交流群:225443677 

posted @ 2016-12-14 14:28  LI小白  阅读(1001)  评论(0编辑  收藏  举报