前言
最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能。
通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过ajax调用session里的执行状态,从而实现反馈导入状态的功能!
上代码: 前端页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
<!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 > |
后台页面:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
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