前言
最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能。
通过线程执行导入,并把正在执行的状态存入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