时间:2016-02-15 21:44 来源: 我爱IT技术网 作者:佚名
欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【asp.net 在客户端显示服务器端任务处理进度条的探讨】,下面是详细的讲解!
asp.net 在客户端显示服务器端任务处理进度条的探讨
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1 -
transitional.dtd">
<script runat="server">
/// <summary>
/// 设置全局变量,以便不同的方法是用
/// </summary>
private int Processbar=0; //设置初始的状态,也可以代表一系列步骤中的每个步骤。
private int TotalCount=100; //设置初始值,防止出现被0除。
private String key;
protected void ProcessTask()
{
while (Processbar < TotalCount)
{
Processbar=this.GetProcessbar() + 5; //这里只是模拟一下,每次加 5
System.Threading.Thread.Sleep(1000); //这里只是模拟一个长时间的执行过程。
SaveData();
}
}
protected void Page_Load(object sender, EventArgs e)
{
key=Request.QueryString["guid"]; //多个并发请求时,用来区分客户端的请求。
if (String.IsNullOrEmpty(key)) key=Guid.NewGuid().ToString();
Processbar=this.GetProcessbar();
TotalCount=this.GetTotalCount();
//以下判断原来判断请求的不同过程,是第一次请求,还是更新进度条的请求,实现方法也可以划分为多个程序来实现。
if (Request.QueryString["step"] !=null && Request.QueryString["step"].Equals(String.Empty)==false)
{
if (Request.QueryString["step"].Equals("1"))
{
// 开始执行任务的请求,启动长时间的任务处理。
Processbar=0;
//通过计算,得出TotalCount的值,比如查询数据库等,也可以是一个任务的多个步骤的总和。
TotalCount=200; //假如完成一个任务需要200个步骤
SaveData();
System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(ProcessTask));
thread.Start();
Response.ClearContent();
Response.Write(0);
Response.End();
}
else
{
Response.ClearContent();
if (Processbar < TotalCount)
{
// 输出处理的过程
Response.Write(Processbar * 100 / TotalCount);
}
else
{
// 所有的任务都完成了,输出结束信息,终止前端的请求。
Response.Write("ok");
Cache.Remove(key);
}
Response.End();
}
}
else
{
G.Text=key;
if (System.IO.File.Exists(Server.MapPath(key + ".txt")))
{
System.IO.File.Delete(Server.MapPath(key + ".txt"));
}
}
}
/// <summary>
/// 得到执行过程的阶段
/// </summary>
/// <returns></returns>
private int GetProcessbar()
{
String data=Convert.ToString(Cache.Get(key));
if (String.IsNullOrEmpty(data))
return 0;
else
{
return Convert.ToInt32(data.Split(',')[0]);
}
}
/// <summary>
/// 得到全部的过程数
/// </summary>
/// <returns></returns>
private int GetTotalCount()
{
String data=Convert.ToString(Cache.Get(key));
if (String.IsNullOrEmpty(data))
return 0;
else
{
return Convert.ToInt32(data.Split(',')[1]);
}
}
/// <summary>
/// 将过程保存。
/// </summary>
private void SaveData()
{
WriteLog();
Cache.Insert(key, Processbar.ToString() + "," + TotalCount.ToString());
}
private void WriteLog()
{
System.IO.StreamWriter sw=new System.IO.StreamWriter(Server.MapPath(key + ".txt"), true);
sw.WriteLine("Processbar=" + Processbar + " TotalCount=" + TotalCount + " " + System.DateTime.Now.ToString
());
sw.Close();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml ">
<head id="Head1" runat="server">
<title>在客户端显示服务器端任务处理进度条的探讨</title>
<script type="text/javascript">
var http=null;
var count=1;
var timer=null;
var guid="<asp:Literal id='G' runat='server'/>";
function createXMLHTTP() {
return window.XMLHttpRequest ? new window.XMLHttpRequest() : new window.ActiveXObject("MSXML2.XMLHTTP");
}
function showProcess() {
http=createXMLHTTP();
http.open("GET", "<%=Request.Url.ToString() %>?step=" + (count++) + "&guid=" + guid + "&" + Date.parse(new
Date()), true);
http.setRequestHeader("Connection", "close");
http.onreadystatechange=function() {
if (http.readyState==4 && http.status==200)
if ("ok"==http.responseText) {
document.getElementById("process").innerHTML=document.getElementById("processbar1").innerHTML="完成";
document.getElementById("processbar2").style.width="100%";
window.clearInterval(timer);
}
else {
document.getElementById("process").innerHTML=document.getElementById("processbar1").innerHTML=
http.responseText + "%";
document.getElementById("processbar2").style.width=http.responseText + "%";
}
}
http.send(null);
}
function startTask() {
count=1;
document.getElementById("process").innerHTML=document.getElementById("processbar1").innerHTML="0%";
document.getElementById("processbar2").style.width="0%";
timer=window.setInterval("showProcess()", 1000);
return false;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<input type="button" value="启动处理长时间操作" onclick="return startTask();" />
<div style="border: 1px solid blue; width: 600px; position: relative;margin:10px 0;">
<div style="background: #f00; width: 0; height: 20px;" id="processbar2"></div>
<div style="position: absolute; text-align: center; top: 0; width: 100%" id="processbar1"></div>
</div>
<div id="process"></div>
</form>
</body>
</html>
关于asp.net 在客户端显示服务器端任务处理进度条的探讨的用户互动如下:
相关问题:
答: >>详细
相关问题:
答: >>详细
相关问题:
答: >>详细
- 【创建】ASP.NET Web API教程 创建域模型的方法详
- 【服务器】asp.net页面状态管理cookie和服务器状
- 如何取消.net后台线程的执行
- 【WeakReference】WeakReference(弱引用)让GC需要
- 【ajax格式】asp.net中在用ajax格式传递数据到asp
- 【字符文本】asp.net 数据绑定 使用eval 时候报
- 【Repeater控件】.NET实现Repeater控件+AspNetPag
- 【客户端】获取客户端IP地址c#/vb.net各自实现代
- 【asp】asp.net上传execl文件后 在页面上加载显示
- 【JSON】浅析JSON序列化与反序列化-序列化-反序列
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
