手机版

关于ASP.NET在客户端显示服务器任务处理进度条的讨论

时间:2021-10-26 来源:互联网 编辑:宝哥软件园 浏览:

下面就是采用静态变量的方法实现的:复制代码代码如下: %@页面语言='C#' %!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN ' ' http://www .w3。org/TR/XHTML 1/DTD/XHTML 1-Transitional。' DTD '脚本runat='服务器'私有静态int process bar=0;私有静态int TotalCount=100//设置初始值,防止出现被0除受保护的void ProcessTask() { //通过计算,得出总计数的值,比如查询数据库等TotalCount=150while(进程条总计数){进程条=5;系统。线程。线程。睡眠(1000);} }受保护的无效页面_加载(对象发送者,事件参数e) {如果(请求QueryString['step']!=空请求询问步骤.等于(字符串。空==假){如果(请求询问步骤.等于(“1”){进程条=0;系统。线程。线程=新系统。线程。线程(新系统线程化。线程启动(进程任务));线start();回应ClearContent();回应。写入(0);回应end();} else { Response .ClearContent();if(处理条总数){响应.写(进程条* 100/总计数);} else { Response .写(“ok”);}回应end();} } }/脚本html xmlns=' http://www。w3。org/1999/XHTML ' head runat=' server ' title在客户端显示服务器端任务处理进度条的探讨/title脚本类型=' text/JavaScript ' var http=null;定义变量计数=1;定义变量计时器=null函数createXMLHTTP(){ 0返回窗口XMLHttpRequest?新窗口XMLHttpRequest() :新窗口ActiveXObject('MSXML2 .XMLHTTP’);}函数show process(){ http=createXMLHTTP()。http。打开(' GET ',' %=请求.Url。ToString() %?步骤='(计数)' '日期。解析(新的Date()),真);http。onreadystatechange=function(){ if(http。readystate==4 http。status==200)if(' ok '==http。responsetext){ document。getelementbyid(' process ').innerHTML='完成;window.clearInterval(计时器);} else { document。getelementbyid(' process ').innerHTML=http。responsetext " %} } http。发送(null);}函数startTask(){ count=1;文件。getelementbyid(' process ').innerHTML=' 0% ';定时器=窗口。setinterval(' showProcess()',1000);返回假的}/脚本/标题正文表单id='form1' runat='server '输入类型='按钮'值='开始处理长时间操作onclick=' return StartTask();'/div id=' process '/div/form/body/html这种方法,在一个用户访问的情况下是没有问题的,但多个用户访问时就会造成混乱。下面这这种方法,是常用的方法,一般情况下可以满足需求:复制代码代码如下: %@页面语言='C#' %!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN ' ' http://www .w3。org/TR/XHTML 1/DTD/XHTML 1-Transitional。' DTD '脚本runat='server' ///summary //设置全局变量,以便不同的方法是用////summary private int process bar=0;//设置初始的状态,也可以代表一系列步骤中的每个步骤private int TotalCount=100//设置初始值,防止出现被0除私有字符串密钥;受保护的void process task(){ while(进程条总数){进程条=this .GetProcessbar()5;//这里只是模拟一下,每次加5系统。线程。线程。睡眠(1000);//这里只是模拟一个长时间的执行过程save DATa();} }受保护的无效页面_加载(对象发送方,事件参数e) {密钥=请求.查询字符串[' guid '];//多个并发请求时,用来区分客户端的请求如果(字符串IsNullOrEmpty(key)) key=Guid .NewGuid().ToString();Processbar=这个GetProcessbar();TotalCount=这个.gettotal count();//以下判断原来判断请求的不同过程,是第一次请求,还是更新进度条的请求,实现方法也可以划分为多个程序来实现如果(请求QueryString['step']!=空请求询问步骤.等于(字符串。空==假){如果(请求询问步骤.等于(' 1 '){//开始执行任务的请求,启动长时间的任务处理。

进程条=0;//通过计算,得出总计数的值,比如查询数据库等,也可以是一个任务的多个步骤的总和TotalCount=200//假如完成一个任务需要200个步骤保存数据();系统。线程。线程=新系统。线程。线程(新系统线程化。线程启动(进程任务));线start();回应ClearContent();回应。写入(0);回应end();} else { Response .ClearContent();if (Processbar TotalCount) { //输出处理的过程回应写入(进程条* 100/总计数);} else { //所有的任务都完成了,输出结束信息,终止前端的请求回应。写(“ok”);缓存。移除(键);}回应end();} } else { G . Text=key如果(系统。文件存在(服务器. MapPath(键' '。)){系统。输入输出文件。删除(服务器. MapPath(键' '。txt’);} } } ///摘要///得到执行过程的阶段////summary///returns/returns private int GetProcessbar(){ String data=Convert .缓存get(key));如果(字符串IsNullOrEmpty(数据))返回0;else {返回转换.ToInt32(数据Split(',')[0]);} } ///摘要///得到全部的过程数////summary///returns/returns private int gettotal count(){ String data=Convert .缓存get(key));如果(字符串IsNullOrEmpty(数据))返回0;else {返回转换.ToInt32(数据Split(',')[1]);} } ///摘要///将过程保存////summary private void SaveData(){ WriteLog();缓存。插入(键,处理器条ToString()',' TotalCount .ToString());}私有空写日志(){系统.新系统。流写入器(服务器. MapPath(键' '。txt’),真);西南航空。写线(' Processbar=' Processbar '总计数='总计数')系统日期时间。现在。tostring());西南航空close();}/script html xmlns=' http://www。w3。org/1999/XHTML ' head id=' head 1 ' runat=' server ' title在客户端显示服务器端任务处理进度条的探讨/title脚本类型=' text/JavaScript ' var http=null;定义变量计数=1;定义变量计时器=nullvar guid=' ASP : iteral id=' G ' runat=' server/';函数createXMLHTTP(){ 0返回窗口XMLHttpRequest?新窗口XMLHttpRequest() :新窗口ActiveXObject('MSXML2 .XMLHTTP’);}函数showProcess(){ http=createXMLHTTP();http.open('GET ',' %=请求.Url。ToString() %?步骤='(计数)' guid=' guid ' '日期。解析(新的Date()),真);http.setRequestHeader(')连接','关闭');http。onreadystatechange=function(){ if(http。readystate==4 http。status==200)if(' ok '==http。responsetext){ document。getelementbyid(' process ').innerHTML=文档。getelementbyid(“进程条1”).innerHTML='完成;文件。getelementbyid('进程条2 ')。风格。宽度=' 100% ';window.clearInterval(计时器);} else { document。getelementbyid(' process ').innerHTML=文档。getelementbyid(“进程条1”).innerHTML=http。responsetext " %文件。getelementbyid('进程条2 ')。风格。width=http。responsetext " %} } http。发送(null);}函数startTask(){ count=1;文件。getelementbyid(' process ').innerHTML=文档。getelementbyid(“进程条1”).innerHTML=' 0% ';文件。getelementbyid('进程条2 ')。风格。宽度=' 0% ';定时器=窗口。setinterval(' showProcess()',1000);返回假的}/脚本/标题正文表单id='form1' runat='server '输入类型='按钮'值='启动处理长时间操作onclick=' return StartTask();/div style='border: 1px纯蓝;宽度: 600像素;相对位置:边距:10 px0 ' div style=' background : # f00宽度: 0;height : 20px ' id=' process bar 2 '/div div style=' position :绝对值;文本对齐:中心;top : 0;宽度: 100% ' id='进程栏1 '/div/div id='进程'/div/表单/正文/html代码执行效果孟宪会

然而,用这种方法一切都好吗?完全错误,这种方法仍然存在显示不准确的现象,这是使用Cache造成的。在IIS 6之后增加了应用池的功能,可以大大提高程序的性能,减少由于程序本身的错误导致整个网站的崩溃。但是,如果应用程序池中的“性能”-“Web parks”的数量设置为大于1,则不能使用变量httpapplicationstate(应用程序)、Cache和HttpSessionState(会话),因为每个Web parks都将启动一个w3wp.exe工作进程。每个工作过程都是相互独立的,所以这些变量是不共享的。因此,使用Cache保存程序执行进度的方法并不完全正确。那么最终的方法是什么呢?是的,可以将程序执行进度保存在第三方存储介质上,如数据库、文件系统等。我不会写这个方法代码,只是添加访问数据库的部分。

版权声明:关于ASP.NET在客户端显示服务器任务处理进度条的讨论是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。