日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > BackgroundWorker 實現(xiàn)多線程操作

BackgroundWorker 實現(xiàn)多線程操作

來源:程序員人生   發(fā)布時間:2014-12-20 09:07:46 閱讀次數(shù):3895次

背景介紹:

           在做程序的進程中,我們極可能遇到這樣的情況:當我們履行1個比較耗時的操作,即界面加載數(shù)據(jù)量略大的時,在該操作未完成之前再去操作界面,就會出現(xiàn)停止響應(yīng)的情況,這稱為界面假死狀態(tài),那1個小圓圈轉(zhuǎn)呀轉(zhuǎn)的,想必大家看著就頭疼。固然這是1個非常影響用戶體驗度的地方。

       怎樣做出1個能夠及時響應(yīng)的用戶界面呢?多線程操作。

       引入BackgroundWorker組件:

       BackgroundWorker是?net里用來履行多線程任務(wù)的控件,它允許編程者在1個單獨的線程上履行1些操作。

經(jīng)常使用方法

1.RunWorkerAsync 開始履行后臺操作。引發(fā) DoWork 事件

2.CancelAsync 要求取消掛起的后臺操作。

        注意:這個方法是將 CancellationPending 屬性設(shè)置為 true,其實不會終止后臺操作。在后臺操作中要檢查 CancellationPending 屬性,來決定是不是要繼續(xù)履行耗時的操作。

 3.ReportProgress 引發(fā) ProgressChanged 事件。

經(jīng)常使用屬性

1.CancellationPending 唆使利用程序是不是已要求取消后臺操作。只讀屬性,默許為 false,當履行了 CancelAsync 方法后,值為 true。

 2.WorkerSupportsCancellation 唆使是不是支持異步取消。要履行 CancelAsync 方法,需要先設(shè)置該屬性為 true。

 3.WorkerReportsProgress 唆使是不是能報告進度。要履行 ReportProgress 方法,需要先設(shè)置該屬性為 true。

經(jīng)常使用事件

 1.DoWork 調(diào)用 RunWorkerAsync 方法時產(chǎn)生。

 2.RunWorkerCompleted 后臺操作已完成、被取消或引發(fā)異常時產(chǎn)生。

 3.ProgressChanged 調(diào)用 ReportProgress 方法時產(chǎn)生。

         注意:在 DoWork 事件處理程序中不操作任何用戶界面對象。而應(yīng)當通過 ProgressChanged 和RunWorkerCompleted 事件與用戶界面進行通訊。

         如果想在 DoWork 事件處理程序中和用戶界面的控件通訊,可在用 ReportProgress 方法。ReportProgress(int percentProgress, object userState),可以傳遞1個對象。

         ProgressChanged 事件可以從參數(shù)ProgressChangedEventArgs 類的UserState 屬性得到這個信息對象。這個事件也能夠?qū)崿F(xiàn)進度條功能,把任務(wù)的進度實時顯現(xiàn)給用戶。

 

       簡單的程序用BackgroundWorker 比 Thread 方便,Thread中和用戶界面上的控件通訊比較麻煩,需要用拜托來調(diào)用控件的 Invoke 或BeginInvoke 方法,沒有 BackgroundWorker 方便。

 

BackgroundWorker Demo

namespace BackgroundWorkerTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); backgroundWorker1.WorkerReportsProgress = true;//報告完成進度 backgroundWorker1.WorkerSupportsCancellation = true;//允許用戶終止后臺線程 } //開始按鈕 private void button1_Click(object sender, EventArgs e) { if (!backgroundWorker1.IsBusy )//判斷backgroundWorker1是不是正在運行異步操作 { //backgroundWorker1.RunWorkerAsync(); backgroundWorker1.RunWorkerAsync(1000);//開始履行后臺操作,調(diào)用DoWork事件 } } //DoWork事件聲明要履行的耗時操作 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { e.Result = ListNumber(backgroundWorker1, e);//運算結(jié)果保存在e.Result中 } bool ListNumber(object sender, DoWorkEventArgs e) { int num=(int)e.Argument;//接收傳入的參數(shù) for (int i = 1; i <= num; i++) { if (backgroundWorker1.CancellationPending)//判斷是不是要求了取消后臺操作 { e.Cancel=true; return false; } //backgroundWorker1.ReportProgress(i * 100 / num); backgroundWorker1.ReportProgress(i * 100 / num,i);//報告完成進度 Thread.Sleep(0);//后臺線程交出時間片 } return true; } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { //將完成進度數(shù)據(jù)傳給進度條 progressBar1.Value = e.ProgressPercentage; label1.Text = e.ProgressPercentage + "%"; //將中間計算結(jié)果在ListBox控件中顯示出來 listBox1.Items.Add(e.UserState); } Private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (!e.Cancelled && e.Error==null) { MessageBox.Show("處理完成了嗎? " + e.Result); } else//如果取消后臺線程或產(chǎn)生了異常 { MessageBox.Show("處理完成了嗎? false"); } } //取消按鈕 private void button2_Click(object sender, EventArgs e) { if (backgroundWorker1.WorkerSupportsCancellation==true) { backgroundWorker1.CancelAsync();//取消后臺操作 backgroundWorker1.Dispose();//釋放資源 } } } }

總結(jié):

使用backgroundWorker實現(xiàn)多線程大致的步驟是:

1、 綁定線程,設(shè)置屬性

2、調(diào)用BackgroundWorkerRunWorkerAsync方法(可以傳遞參數(shù)),它將調(diào)用DoWork事件

3、聲明DoWork事件的拜托方法,在后臺履行耗時的操作

4、在耗時操作中判斷CancellationPending屬性,如果為false則退出

5、如果要向用戶界面發(fā)送信息,則調(diào)用BackgroundWorkerReportProgress方法,它將調(diào)用ProgressChanged事件(可以將改變通過object類型傳遞)

6、在ProgressChanged事件的響應(yīng)代碼中將改變顯現(xiàn)給用戶,類似進度條。

7、如果需要取消耗時操作,則調(diào)用BackgroundWorkerCancelAsync方法,需要和步驟31起使用

 

    總的來講就是用backgroundWorker組件來新建1個線程,把耗時的部份放到這個線程中在后臺進行處理。這樣就不會影響界面的正常使用。舉個通俗的例子,在我們打開1個網(wǎng)頁的時候,先加載完的總是文字,然后圖片在漸漸出現(xiàn)。這就是線程的利用,網(wǎng)頁打開的時候先顯現(xiàn)出文字,供用戶閱讀,然后把加載圖片放到1個單獨的線程中,異步的在后臺履行,履行終了后把圖片顯現(xiàn)出來。

    這樣就避免了1打開界面就加載大量信息,而釀成的界面假死狀態(tài),大大提高了用戶體驗度。

 

 

線程處理這塊不熟,希望大家指導(dǎo)。


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲品质自拍视频网站 | 精品在线一区二区 | 日韩高清免费在线 | 91av视频在线播放 | 玖玖久久 | 欧美自拍日韩 | 欧美色欧美亚洲另类七区 | 九九精品影院 | 性做久久久久久免费观看欧美 | 999视频| 日韩午夜av| 日日干天天操 | 亚洲永久精品国产 | 国产伦精品一区 | 一区二区三区在线电影 | 男女午夜视频在线观看 | 国产一区二区三区四区 | 91精品啪在线观看国产81旧版 | 欧美成人a级片 | 91欧美精品成人综合在线观看 | 久久国产精品久久久久久久久久 | 精品视频网站 | 国产亚洲高清视频 | 国产1区| 成 人色 网 站 欧美大片在线观看 | 欧美午夜影院 | 中文字幕亚洲综合 | 99精品国产热久久91蜜凸 | 欧美日韩一区二区电影 | 九九九九九精品 | 久色伊人| 欧美成人a | 日韩在线免费视频 | 色综合国产 | 欧美日韩无 | 中文自拍 | 青青草久久 | 成人h动漫精品一区二区 | 国产免费av电影 | 视频一区二区三区在线 | 日韩影视精品 |