<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 22:43:57
        文檔

        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 -transi
        推薦度:
        導讀asp.net 在客戶端顯示服務器端任務處理進度條的探討:下面就是采用靜態變量的方法實現的: 代碼如下:<%@ Page Language=C# %> <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1 -transi

        下面就是采用靜態變量的方法實現的:
        代碼如下:

        <%@ 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 id="form1" runat="server">
        <input type="button" value="開始處理長時間操作" onclick="return startTask();" />
        <div id="process"></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 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>

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

        那么終極的方法是什么呢?對,將程序執行進度保存在第三方的存儲介質上,如數據庫,文件系統等等都是可以的。這個方法代碼我就不寫了,就是增加訪問數據庫的部分即可。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        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 -transi
        推薦度:
        標簽: 處理 net 處理的
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久亚洲国产精品五月天婷| 日本免费人成视频播放| 亚洲精品夜夜夜妓女网| 免费的黄色的网站| 亚洲熟妇少妇任你躁在线观看无码| 国产成人综合久久精品亚洲| 免费国产精品视频| 一级做a爱过程免费视频高清| 亚洲精品老司机在线观看| 一级毛片**免费看试看20分钟| JLZZJLZZ亚洲乱熟无码| 韩国免费A级毛片久久| 国产亚洲精AA在线观看SEE| 国产精品区免费视频| 91亚洲性爱在线视频| 免费鲁丝片一级在线观看| 日韩色日韩视频亚洲网站| 久久久久亚洲AV成人网人人网站| 国产午夜成人免费看片无遮挡| 内射干少妇亚洲69XXX| 波多野结衣在线免费观看| 亚洲天堂一区二区三区| 成人a视频片在线观看免费| 亚洲AV无码AV日韩AV网站| 亚洲AV无码不卡在线观看下载| 特级毛片爽www免费版| 亚洲AV天天做在线观看| 无限动漫网在线观看免费| 国产综合激情在线亚洲第一页| 日韩一卡2卡3卡4卡新区亚洲| 男的把j放进女人下面视频免费| 91亚洲自偷在线观看国产馆| 免费人成在线观看网站视频| 美女视频黄的免费视频网页| 亚洲一区二区三区不卡在线播放| 可以免费观看一级毛片黄a| 免费A级毛片无码专区| 亚洲精品国产首次亮相| 亚洲AV无码精品色午夜果冻不卡| 人禽杂交18禁网站免费| 精选影视免费在线 |