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

首頁 > 學院 > 開發設計 > 正文

ASP.NET 多線程 監控任務執行情況,并顯示進度條

2019-11-17 01:27:28
字體:
來源:轉載
供稿:網友

asp.net 多線程 監控任務執行情況,并顯示進度條

關于多線程的基本概念和知識在本文中不多講,而且我懂的也不是很透,說的太多誤人子弟...對于我來說,做本文提到的功能夠用就行,等實現其他效果不夠用的時候,再深入研究

推薦看園子里的兩篇博客應該就有個基本的認識了:

C#多線程(一):http://www.49028c.com/oshyn/p/3628686.html

C#多線程(二):http://www.49028c.com/oshyn/p/3628792.html

有時候我們在執行一個較長任務的時候,瀏覽器就好比處于“掛起”的狀態,你得等待他把這一個事情處理完畢再去處理其他事情。

那么比如說我們在執行一個反復插入數據庫的操作,或者說執行大量的IO的操作的時候,這個過程往往是很耗時的,瀏覽器長時間不響應,對于客戶的忍耐度是一個挑戰。

就好像你在安裝游戲,只有一段文字提示你“正在安裝,請稍后...”結果稍后了半個小時還在稍后,我不知道還要稍后多久,那我簡直要瘋了。

所以這時候,如果能實時顯示當前安裝包正在做什么,復制什么文件,執行什么操作,已完成了多少,還剩下多少。這樣的話,果然是極好的......

以前也知道做這個功能的時候需要用到多線程來執行,基本道理和思路也懂,但是覺得多線程太麻煩,也不利于管理,因此很傻很天真地想了一個變相解決方案。

基本想法是這樣的:

在執行任務的頁面上放上兩段JS代碼,分別是: dowork() checkstate()。其中,dowork() 以Ajax方式提交請求,執行耗時長的操作,在操作過程中,不斷把執行信息寫入session,而checkstate()以ajax的方式提交請求,執行獲取session信息,接收到響應之后,寫入div中顯示出來。

然而事實上是,在執行操作過程中,確實把任務信息寫入了session,但是在dowork()請求的任務執行完畢之前,checkstate()請求的 讀取session的操作是不會執行的,在dowork請求的任務執行完畢之后,checkstate()才會把最終的session值獲取到。

雖然知道可能是關于單線程的任務執行順序問題,但是具體說不出來個門道(有哪位行家給分析分析。。。。。不勝感謝~)

后來就只能做多線程來實現了,不多廢話,直接上代碼,注釋寫的都很詳細

主要分為兩個頁面 一個任務執行頁面(Default) ,放置的按鈕和信息呈現的容器,另一個頁面是ajax請求頁面(ajaxWork),用來執行請求操作和返回響應信息。

1 <div>2     多線程監測任務執行情況示例3     <br /><br />4     <div class="msg"><div class="msg2"></div></div><br />5    <input type="button" onclick="create('');" value="開始執行" />&nbsp;&nbsp;&nbsp;&nbsp;6    <span></span>7     </div>
Default.aspx
 1 function create(value) //寫一個點擊執行的函數,點擊請求時,實參為空 2     { 3         var url="ajaxwork.aspx"; //初始化請求地址 4          5         if(value!="") //判斷如果實參不為空,則帶參請求 6         { 7             url+="?key="+value 8         } 9         10         $.post(url,function(data)11         {12             var rs = new Function("return" + data)(); //轉換JSON數據13             14             $("span").html("用時:"+rs.time+"&nbsp;&nbsp;&nbsp;&nbsp;已完成:"+rs.curr+"%"); //輸出當前任務執行情況15             16             $(".msg2").CSS("width",rs.curr+"%"); // 控制進度條的加載17             18             if(rs.curr!="100") //判斷如果沒有查到100 則遞歸執行本方法19             {20                 create("1"); //帶參請求(參數是多少無所謂,有就行),獲取任務執行狀態21             }22         });23     } 
頁面腳本
 1 using System; 2 using System.Threading; 3  4 public partial class AjaxWork : System.Web.UI.Page 5 { 6     static string count = ""; 7     PRotected void Page_Load(object sender, EventArgs e) 8     { 9         if (Request.QueryString["key"] == null) //判斷如果為空 則為第一次請求 啟動所要執行的任務10         {11             Start();12         }13         else //否則為請求任務執行的狀態14         {15             ajaxResponse();16         }17     }18 19     /// <summary>20     /// 線程所要執行的查數方法21     /// </summary>22     private void DoWork()23     {24         count = "{'curr':'0','time':'00:00:00.0000000'}";//每次執行操作之前 初始化信息25         DateTime starttime = DateTime.Now; //獲取任務開始的時間26         for (int i = 1; i < 101; i++) //從1查數到10027         {28             Thread.Sleep(100); // 為了不讓程序一下執行完畢,設置線程的休眠,方便演示29             count = "{'curr':'" + i.ToString() + "','time':'" +(DateTime.Now - starttime) + "'}"; //反饋當前任務狀態30         }31     }32 33     /// <summary>34     /// 線程啟動35     /// </summary>36     private void Start()37     {38         Thread t = new Thread(DoWork); //實例化一個線程39         t.Start(); //啟動40         Response.Write("{'curr':'0','time':'00:00:00.0000000'}"); //第一次請求返回初始化的信息41     }42 43     /// <summary>44     /// 獲取任務的實時信息45     /// </summary>46     private void ajaxResponse()47     {48         Response.Write(count);49         Response.Flush();50         Response.End();51     }52 }
ajaxWork.aspx.cs

效果如下圖:

Demo下載:http://files.VEVb.com/webconfig/Thread.rar

==============================華麗的分割線==================================

另外一個問題是,不知道為什么,在ajaxWork.aspx.cs中 聲明的

1 static string count = ""

如果你在每次執行線程的時候不進行初始化操作

那么,你在第一次執行的時候,是正常的。但是,第一次執行完成之后,再次點按鈕的時候,就會出現“抽筋”情況,具體可以下載demo看效果、

斷電調試,可以發現,第二次執行,count初始化的值,不是“”,而是第一次執行完畢之后的值:

哪位高手給解釋一下...

忽然想到了生命周期的問題,原來一直以為,靜態變量的生命周期是隨著類的消亡而消亡的,對于ASP.NET,好像不是這樣,看到一篇文章上提到,靜態變量是application級別的,也就是說除非IIS重啟,否則靜態變量的值就是最后修改的值...也許可以解釋這個問題吧

文章地址:http://www.49028c.com/webconfig/p/3632260.html

---- 內容補充 -------------------------------------------------------------------------------

今天下午有稍微研究了一下,也感謝@AllEmpty提出的觀點,用靜態變量傳值確實會引發并發問題,當時為了圖省事直接用靜態變量傳值了。后來想過用session傳值,可是在新開辟的線程中使用session 總是引發異常,異常提示為:

今天下午終于找到原因了,那就是在新開辟的線程使用session之前,需要在主線程中聲明出session,否則就會引起該異常。

所以我們修改代碼:

1,聲明的靜態變量count去掉,在線程啟動之前在主線程聲明出session

        if (Request.QueryString["key"] == null) //判斷如果為空 則為第一次請求 啟動所要執行的任務        {            Session["count"] = "";            Start();        }

2,使用session記錄狀態:

 1     private void DoWork() 2     { 3         Session["count"] = "{'curr':'0','time':'00:00:00.0000000'}";//每次執行操作之前 初始化信息 4         DateTime starttime = DateTime.Now; //獲取任務開始的時間 5         for (int i = 1; i < 101; i++) //從1查數到100 6         { 7             Thread.Sleep(100); // 為了不讓程序一下執行完畢,設置線程的休眠,方便演示 8             Session["count"] = "{'curr':'" + i.ToString() + "','time':'" + (DateTime.Now - starttime) + "'}"; //反饋當前任務狀態 9         }10     }

3,響應session的值

1         string countstr = "";2         if (Session["count"] != null)3         {4             countstr = Session["count"].ToString();5         }6         Response.Write(countstr);

OK,并發問題解決!?。?/p>

本文出自博客園:D調的碼農

轉載請注明出處:http://www.49028c.com/webconfig/p/3632208.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩激情片免费| 亚洲色图17p| 久久99青青精品免费观看| 欧美精品成人在线| 国产精品普通话| 九九热在线精品视频| 成人福利在线观看| 久久人人看视频| 亚洲精品福利在线| 一本久久综合亚洲鲁鲁| 国语自产在线不卡| 91网站在线看| 91wwwcom在线观看| 国产精品99久久久久久人| 伊人久久男人天堂| 久久久精品久久| 欧美日韩国产综合视频在线观看中文| 日韩av免费看| 亚洲图片在区色| 欧美极度另类性三渗透| 一区二区三区天堂av| 91九色国产社区在线观看| 欧美午夜精品久久久久久人妖| 国产精品白丝jk喷水视频一区| 日韩精品免费在线观看| 97精品视频在线观看| 亚洲在线第一页| 国产一区二区三区欧美| www.久久色.com| 欧美丰满片xxx777| 91高潮精品免费porn| 欧美日韩亚洲精品内裤| 久久久久这里只有精品| 欧美亚洲国产日韩2020| 69久久夜色精品国产7777| 国产日韩一区在线| 国产精品视频永久免费播放| 激情亚洲一区二区三区四区| 91免费精品国偷自产在线| 欧美激情第6页| 亚洲午夜国产成人av电影男同| 国产成人亚洲精品| 青青久久av北条麻妃黑人| 国产精品国产亚洲伊人久久| 欧美裸体xxxx| 国产一区二区三区在线看| 国产+成+人+亚洲欧洲| 91精品国产色综合久久不卡98口| 77777少妇光屁股久久一区| 91国在线精品国内播放| 亚洲一区二区三区成人在线视频精品| 日韩欧美在线中文字幕| 国产精品青青在线观看爽香蕉| www亚洲精品| 国产精品91在线| 日韩在线观看电影| 中文日韩在线观看| 国产在线久久久| 亚洲一区二区黄| 日本久久久久亚洲中字幕| 久久韩剧网电视剧| 91成人天堂久久成人| 国产一区二区香蕉| 亚洲在线免费观看| 国产亚洲日本欧美韩国| 中文字幕国内精品| 2018中文字幕一区二区三区| 97婷婷大伊香蕉精品视频| xxx一区二区| 欧美成人精品一区二区| 久久免费精品日本久久中文字幕| 亚洲人成欧美中文字幕| 国产精品成人免费电影| 日韩激情av在线免费观看| 成人444kkkk在线观看| 97色在线观看免费视频| 精品一区二区亚洲| 国产精品久久久久77777| 成人午夜黄色影院| 日韩欧美在线中文字幕| 久久精品国产亚洲一区二区| 国产视频观看一区| 国产欧美日韩亚洲精品| 九九视频这里只有精品| 中文字幕亚洲欧美日韩在线不卡| 日韩免费在线观看视频| 国产精品黄色影片导航在线观看| 成人妇女免费播放久久久| 在线视频中文亚洲| 九色成人免费视频| 永久免费精品影视网站| 日韩欧美在线免费观看| 欧美日韩一区二区在线| 久久人人爽人人爽人人片亚洲| 国内精品久久久久久| 亚洲国产黄色片| 狠狠色狠狠色综合日日小说| 久久人人爽人人爽人人片av高请| 久久久中文字幕| 亚洲bt欧美bt日本bt| 成人午夜激情免费视频| 欧美最猛黑人xxxx黑人猛叫黄| 久久精品国产欧美激情| 国产精品av免费在线观看| 最新国产精品亚洲| 欧美刺激性大交免费视频| 久久伊人精品视频| 国产精品亚洲片夜色在线| 精品亚洲精品福利线在观看| 国产精品久久久久久久久借妻| 亚洲第一视频网| 日韩精品电影网| 国产精品99久久99久久久二8| 国产成人亚洲综合青青| 国产精品成人aaaaa网站| 日韩av影视综合网| 亚洲无av在线中文字幕| 精品亚洲精品福利线在观看| 精品国产一区二区三区久久狼黑人| 欧美国产精品va在线观看| 亚洲男人的天堂在线播放| 欧美黑人国产人伦爽爽爽| 欧美极品第一页| 91久久精品美女高潮| 国内精品久久久久久久久| 亚洲国产精品99| 亲子乱一区二区三区电影| 伦伦影院午夜日韩欧美限制| 久久久精品免费| 国内精久久久久久久久久人| 亚洲欧美精品一区| 日韩在线观看视频免费| 欧美一级成年大片在线观看| 国产日本欧美一区| 亚洲欧美成人精品| 日韩视频永久免费观看| 亚洲日本成人女熟在线观看| 美日韩精品视频免费看| 日韩中文在线中文网三级| 国产婷婷成人久久av免费高清| 亚洲丝袜av一区| 成人激情免费在线| 91精品国产自产在线观看永久| 国产精品a久久久久久| 亚洲视频在线观看免费| 亚洲欧美日韩成人| 久久久久久这里只有精品| 538国产精品一区二区在线| 国产91色在线播放| 国产亚洲欧美日韩一区二区| 亚洲国产精品va在看黑人| 国产精品美女在线| 久久精品青青大伊人av| 欧美视频中文在线看| 国产91在线高潮白浆在线观看| 亚洲国产女人aaa毛片在线| 亚洲福利视频在线| 亚洲电影成人av99爱色| 久久久噜噜噜久噜久久| 国产精品久久久一区| 国产午夜精品免费一区二区三区| 亚洲在线观看视频网站| 国产精品视频在线观看| 欧美专区在线观看|