亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

asp.net 在客戶端顯示服務器端任務處理進度條的探討

2024-07-10 13:19:28
字體:
來源:轉載
供稿:網友
下面就是采用靜態變量的方法實現的:

復制代碼 代碼如下:


<%@ 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">
private static int Processbar = 0;
private static int TotalCount = 100; //設置初始值,防止出現被0除。
protected void ProcessTask()
{
//通過計算,得出TotalCount的值,比如查詢數據庫等
TotalCount = 150;
while (Processbar < TotalCount)
{
Processbar += 5;
System.Threading.Thread.Sleep(1000);
}
}

protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["step"] != null && Request.QueryString["step"].Equals(String.Empty) == false)
{
if (Request.QueryString["step"].Equals("1"))
{
Processbar = 0;
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");
}
Response.End();
}
}
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml ">
<head runat="server">
<title>在客戶端顯示服務器端任務處理進度條的探討</title>
<script type="text/javascript">
var http = null;
var count = 1;
var timer = null;
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++) + "&" + Date.parse(new Date()), true);
http.onreadystatechange = function() {
if (http.readyState == 4 && http.status == 200)
if ("ok" == http.responseText) {
document.getElementById("process").innerHTML = "完成";
window.clearInterval(timer);
}
else {
document.getElementById("process").innerHTML = http.responseText + "%";
}
}
http.send(null);
}

function startTask() {
count = 1;
document.getElementById("process").innerHTML = "0%";
timer = window.setInterval("showProcess()", 1000);
return false;
}
</script>

</head>
<body>
<form runat="server">
<input type="button" value="開始處理長時間操作" />
<div></div>
</form>
</body>
</html>


這種方法,在一個用戶訪問的情況下是沒有問題的,但多個用戶訪問時就會造成混亂。

下面這這種方法,是常用的方法,一般情況下可以滿足需求:

復制代碼 代碼如下:


<%@ 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 runat="server">
<title>在客戶端顯示服務器端任務處理進度條的探討</title>

<script type="text/javascript">
var http = null;
var count = 1;
var timer = null;
var guid = "<asp:Literal 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 runat="server">
<input type="button" value="啟動處理長時間操作" />
<div>
<div></div>
<div></div>
</div>
<div></div>
</form>
</body>
</html>


代碼執行效果:

asp.net 在客戶端顯示服務器端任務處理進度條的探討

 
但是,這種方法就是萬事大吉了嗎?完全錯誤,這種方法仍然存在顯示不準確的現象,造成顯示不準確的原因就是 Cache 的使用,IIS 6之后,增加了應用程序池的功能,這個功能可以大大提高程序的性能,減少程序本身的錯誤導致的整個網站的崩潰。但是,如果應用程序池的“性能”-“Web 園”數目設置大于1的情況下,HttpApplicationState(Application)、Cache、HttpSessionState(Session)這些變量都是都是無法使用了,這是因為:每個Web 園會啟動一個w3wp.exe工作進程,每個工作進程之間是相互獨立的,以上這些變量也就是不是共享的了,所以,使用Cache保存程序執行進度的方法也是不完全正確的。

那么終極的方法是什么呢?對,將程序執行進度保存在第三方的存儲介質上,如數據庫,文件系統等等都是可以的。這個方法代碼我就不寫了,就是增加訪問數據庫的部分即可。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精彩精品视频| 日韩大片免费观看视频播放| 庆余年2免费日韩剧观看大牛| 国产精品白嫩初高中害羞小美女| 一区三区二区视频| 成人欧美在线视频| 欧美电影在线免费观看网站| 2019亚洲男人天堂| 欧美xxxwww| 国产原创欧美精品| 欧美成人国产va精品日本一级| 欧美电影在线观看网站| 久热精品视频在线| 欧美电影免费观看电视剧大全| 欧美最顶级丰满的aⅴ艳星| 都市激情亚洲色图| 91视频国产一区| 日韩国产精品视频| 久久综合色影院| 一区二区三区视频免费在线观看| 97色在线观看免费视频| 国产一区二区视频在线观看| 欧美色播在线播放| 亚洲国产精久久久久久久| 2019中文字幕在线免费观看| 久久理论片午夜琪琪电影网| 午夜欧美大片免费观看| 国产精品成人aaaaa网站| 中日韩美女免费视频网站在线观看| 韩国v欧美v日本v亚洲| 国产精品成熟老女人| 日韩欧美视频一区二区三区| 久久久国产精品一区| 国产一区二区三区在线观看网站| 影音先锋欧美在线资源| 亚洲国产日韩欧美在线99| 精品在线观看国产| 97精品久久久中文字幕免费| 日韩欧美亚洲成人| 久久久999国产精品| 日韩精品在线观看网站| 在线丨暗呦小u女国产精品| 亚洲欧美成人一区二区在线电影| 亚洲欧美国产va在线影院| 久久精品在线播放| 国产精品亚洲网站| 国产成人一区三区| 亚洲欧美国产精品久久久久久久| 成人网在线视频| 26uuu日韩精品一区二区| 日韩成人在线视频网站| 第一福利永久视频精品| 91视频免费网站| 91黑丝在线观看| 日韩最新免费不卡| 国产精品成人v| 国产日产久久高清欧美一区| 久久激情视频免费观看| 国内免费久久久久久久久久久| 国产日韩欧美影视| 性欧美xxxx交| 欧美日韩中文字幕在线视频| 亚洲欧美另类人妖| 成人免费福利视频| 日韩美女激情视频| 亚洲性无码av在线| 久久久久国产精品免费| 国产激情久久久久| 国自在线精品视频| 国产精品福利在线观看| 国内精品久久久久久中文字幕| 国内精品久久久久久中文字幕| 亚洲精品在线不卡| 亚洲精品免费一区二区三区| 国产精品久久久久av免费| 久久综合色影院| 亚洲bt欧美bt日本bt| 亚洲精品一区在线观看香蕉| 91精品国产网站| 国产999精品久久久| 欧美电影电视剧在线观看| 亚洲福利视频免费观看| 亚洲免费视频一区二区| 97在线视频免费观看| 久久av在线播放| 国产精品一区二区在线| 超碰97人人做人人爱少妇| 国产精品高潮呻吟久久av无限| 色阁综合伊人av| 欧美黑人巨大xxx极品| 久久久久久久久久久免费| 精品久久久久久亚洲国产300| 国产美女扒开尿口久久久| 国产精品久久久久77777| 国产女精品视频网站免费| 伊人久久久久久久久久久久久| 久久精品99久久香蕉国产色戒| 欧美黑人巨大精品一区二区| 日韩精品有码在线观看| 亚洲国产婷婷香蕉久久久久久| 国产成+人+综合+亚洲欧洲| 亚洲国产精品人久久电影| 日韩精品久久久久| 国产不卡精品视男人的天堂| 亚洲精品丝袜日韩| 欧美日本亚洲视频| 欧美黑人一级爽快片淫片高清| 欧美日韩在线视频一区二区| 久久天天躁日日躁| 91wwwcom在线观看| 日韩欧美极品在线观看| 九九视频这里只有精品| 91香蕉亚洲精品| 91a在线视频| 国产精品1区2区在线观看| 久久精品视频va| 久久99精品国产99久久6尤物| 97在线视频观看| 成人免费大片黄在线播放| 国产一区二区三区网站| 日韩**中文字幕毛片| 福利微拍一区二区| 欧美激情国产日韩精品一区18| 国产美女扒开尿口久久久| 精品国内产的精品视频在线观看| 亚洲色图校园春色| 国产一区二区三区久久精品| 97精品伊人久久久大香线蕉| 一区二区三区美女xx视频| 亚洲电影在线观看| 3344国产精品免费看| 国产免费一区二区三区在线能观看| 亚洲精品福利免费在线观看| 九九精品在线播放| 亲子乱一区二区三区电影| 亚洲欧美精品suv| 日韩中文在线视频| 久久久久久久一区二区| 九九综合九九综合| 中文字幕欧美日韩精品| 亚洲男人的天堂在线| 欧美日韩国产影院| 91欧美精品午夜性色福利在线| 日本一区二区在线播放| 欧美日韩激情美女| 国产精品日韩久久久久| 亚洲国产精品悠悠久久琪琪| 91亚洲精品在线| 日本久久亚洲电影| 日本aⅴ大伊香蕉精品视频| 日本久久中文字幕| 国产精品一区二区女厕厕| 欧美成人小视频| 欧美亚洲第一区| 宅男66日本亚洲欧美视频| 91色中文字幕| 欧美成人sm免费视频| 欧美精品久久久久久久久| 欧美激情精品久久久久久蜜臀| 欧美日韩另类字幕中文| 欧美精品免费播放| 91嫩草在线视频| 亚洲bt欧美bt日本bt| 久久人91精品久久久久久不卡|