时间:2021-07-01 10:21:17 帮助过:52人阅读
输出结束信息,终止前端的请求。
- <br><%@ Page Language="C#" %> <br><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1 -transitional.dtd"> <br><script runat="server"> <br>private static int Processbar = 0; <br>private static int TotalCount = 100; //设置初始值,防止出现被0除。 <br>protected void ProcessTask() <br>{ <br>//通过计算,得出TotalCount的值,比如查询数据库等 <br>TotalCount = 150; <br>while (Processbar < TotalCount) <br>{ <br>Processbar += 5; <br>System.Threading.Thread.Sleep(1000); <br>} <br>} <br><br>protected void Page_Load(object sender, EventArgs e) <br>{ <br>if (Request.QueryString["step"] != null && Request.QueryString["step"].Equals(String.Empty) == false) <br>{ <br>if (Request.QueryString["step"].Equals("1")) <br>{ <br>Processbar = 0; <br>System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(ProcessTask)); <br>thread.Start(); <br>Response.ClearContent(); <br>Response.Write(0); <br>Response.End(); <br>} <br>else <br>{ <br>Response.ClearContent(); <br>if (Processbar < TotalCount) <br>{ <br>Response.Write(Processbar * 100 / TotalCount); <br>} <br>else <br>{ <br>Response.Write("ok"); <br>} <br>Response.End(); <br>} <br>} <br>} <br></script> <br><br><html xmlns="http://www.w3.org/1999/xhtml "> <br><head runat="server"> <br><title>在客户端显示服务器端任务处理进度条的探讨</title> <br><script type="text/javascript"> <br>var http = null; <br>var count = 1; <br>var timer = null; <br>function createXMLHTTP() { <br>return window.XMLHttpRequest ? new window.XMLHttpRequest() : new window.ActiveXObject("MSXML2.XMLHTTP"); <br>} <br>function showProcess() { <br>http = createXMLHTTP() <br>http.open("GET", "<%=Request.Url.ToString() %>?step=" + (count++) + "&" + Date.parse(new Date()), true); <br>http.onreadystatechange = function() { <br>if (http.readyState == 4 && http.status == 200) <br>if ("ok" == http.responseText) { <br>document.getElementById("process").innerHTML = "完成"; <br>window.clearInterval(timer); <br>} <br>else { <br>document.getElementById("process").innerHTML = http.responseText + "%"; <br>} <br>} <br>http.send(null); <br>} <br><br>function startTask() { <br>count = 1; <br>document.getElementById("process").innerHTML = "0%"; <br>timer = window.setInterval("showProcess()", 1000); <br>return false; <br>} <br></script> <br><br></head> <br><body> <br><form id="form1" runat="server"> <br><input type="button" value="开始处理长时间操作" onclick="return startTask();" /> <br><div id="process"></div> <br></form> <br></body> <br></html> <br> <br>这种方法,在一个用户访问的情况下是没有问题的,但多个用户访问时就会造成混乱。 <br><br>下面这这种方法,是常用的方法,一般情况下可以满足需求: <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><%@ Page Language="C#" %> <br><br><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1 - <br><br>transitional.dtd"> <br><br><script runat="server"> <br>/// <summary> <br>/// 设置全局变量,以便不同的方法是用 <br>/// </summary> <br>private int Processbar = 0; //设置初始的状态,也可以代表一系列步骤中的每个步骤。 <br>private int TotalCount = 100; //设置初始值,防止出现被0除。 <br>private String key; <br>protected void ProcessTask() <br>{ <br>while (Processbar < TotalCount) <br>{ <br>Processbar = this.GetProcessbar() + 5; //这里只是模拟一下,每次加 5 <br>System.Threading.Thread.Sleep(1000); //这里只是模拟一个长时间的执行过程。 <br>SaveData(); <br>} <br>} <br><br>protected void Page_Load(object sender, EventArgs e) <br>{ <br>key = Request.QueryString["guid"]; //多个并发请求时,用来区分客户端的请求。 <br>if (String.IsNullOrEmpty(key)) key = Guid.NewGuid().ToString(); <br>Processbar = this.GetProcessbar(); <br>TotalCount = this.GetTotalCount(); <br><br>//以下判断原来判断请求的不同过程,是第一次请求,还是更新进度条的请求,实现方法也可以划分为多个程序来实现。 <br>if (Request.QueryString["step"] != null && Request.QueryString["step"].Equals(String.Empty) == false) <br>{ <br>if (Request.QueryString["step"].Equals("1")) <br>{ <br>// 开始执行任务的请求,启动长时间的任务处理。 <br>Processbar = 0; <br>//通过计算,得出TotalCount的值,比如查询数据库等,也可以是一个任务的多个步骤的总和。 <br>TotalCount = 200; //假如完成一个任务需要200个步骤 <br>SaveData(); <br>System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(ProcessTask)); <br>thread.Start(); <br>Response.ClearContent(); <br>Response.Write(0); <br>Response.End(); <br>} <br>else <br>{ <br>Response.ClearContent(); <br>if (Processbar < TotalCount) <br>{ <br>// </li></ol></pre>输出处理的过程 <br>Response.Write(Processbar * 100 / TotalCount); <br>} <br>else <br>{ <br>// 所有的任务都完成了,