C#中backgroundworker的使用教程
介紹:
根據(jù)MSDN介紹:
BackgroundWorker 類允許您在單獨的專用線程上運行操作。 耗時的操作(如下載和數(shù)據(jù)庫事務)在長時間運行時可能會導致用戶界面 (UI) 似乎處于停止響應狀態(tài)。 如果您需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用 BackgroundWorker 類方便地解決問題。
若要在后臺執(zhí)行耗時的操作,請創(chuàng)建一個 BackgroundWorker,偵聽那些報告操作進度并在操作完成時發(fā)出信號的事件。 可以通過編程方式創(chuàng)建 BackgroundWorker,也可以將它從“工具箱”的“組件”選項卡中拖到窗體上。 如果在 Windows 窗體設計器中創(chuàng)建 BackgroundWorker,則它會出現(xiàn)在組件欄中,而且它的屬性會顯示在“屬性”窗口中。
若要為后臺操作做好準備,請?zhí)砑?DoWork 事件的事件處理程序。 在此事件處理程序中調用耗時的操作。 若要開始此操作,請調用 RunWorkerAsync。 若要收到進度更新的通知,請?zhí)幚?ProgressChanged 事件。 若要在操作完成時收到通知,請?zhí)幚?RunWorkerCompleted 事件。
有2點需要注意的:
1、由于DoWork事件內(nèi)部的代碼運行在非UI線程之上,確保在 DoWork 事件處理程序中不操作任何用戶界面對象。 而應該通過 ProgressChanged 和 RunWorkerCompleted 事件與用戶界面進行通信。
2、BackgroundWorker 事件不跨 AppDomain 邊界進行封送處理。 請不要使用 BackgroundWorker 組件在多個 AppDomain 中執(zhí)行多線程操作。
使用:
運行顯示:
1、聲明一個BackgroundWorker
BackgroundWorker backgroundWorker1 = null;
2、初始化BackgroundWorker,設置屬性并綁定事件
public Form1() { InitializeComponent(); backgroundWorker1 = new BackgroundWorker(); backgroundWorker1.WorkerReportsProgress = true;//能否報告進度更新。 backgroundWorker1.WorkerSupportsCancellation = true;//是否支持異步取消 //綁定事件 backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); }
3、BackgroundWorker事件
DoWork事件
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { //句柄sender指向的就是該BackgroundWorker。 //e.Argument 獲取異步操作參數(shù)的值 //e.Cancel 是否應該取消事件 //e.Result 獲取或設置異步操作結果的值(在RunWorkerCompleted事件可能會使用到) object a = e.Argument;//獲取RunWorkerAsync(object argument)傳入的值 BackgroundWorker worker = sender as BackgroundWorker; for (int i = 1; i <= 10; i++) { if (worker.CancellationPending == true)//在耗時操作中判斷CancellationPending屬性,如果為false則退出 { e.Cancel = true; break; } else { // Perform a time consuming operation and report progress. System.Threading.Thread.Sleep(500); worker.ReportProgress(i * 10, "Object userState");// 將觸發(fā)BackgroundWorker.ProgressChanged事件,向ProgressChanged報告進度 } } e.Result = "結束"; }
RunWorkerCompleted事件:當DoWork事件處理完成之后,將會觸發(fā)該事件。
private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { //e.Cancelled指示異步操作是否已被取消 //e.Error 指示異步操作期間發(fā)生的錯誤 //e.Result 獲取異步操作結果的值,即DoWork事件中,Result設置的值。 if (e.Cancelled == true) { resultLabel.Text = "Canceled!"; } else if (e.Error != null) { resultLabel.Text = "Error: " + e.Error.Message; } else { resultLabel.Text = e.Result.ToString(); } }
ProgressChanged事件:ProgressChanged事件處理程序的第二個參數(shù)e有一個ProgressPercentage屬性,它就由 ReportProgress的第一個參數(shù)percentProgress來提供。這個參數(shù)一般用來報告該后臺操作完成的進度,然后用ProgressChanged的第二個參數(shù)e的ProgressPercentage屬性來獲取該進度信息。如果用戶還想傳遞更多的信息,可以使用ReportProgress的第二種重載,它的第二個參數(shù)userState將會傳遞給ProgressChanged事件的參數(shù)e的UserState屬性。
private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { //e.ProgressPercentage 獲取異步操作進度的百分比 resultLabel.Text = (e.ProgressPercentage.ToString() + "%"); string state = (string)e.UserState;//接收ReportProgress方法傳遞過來的userState }
4、按鈕事件
//開始按鈕 private void btnStart_Click(object sender, EventArgs e) { if (backgroundWorker1.IsBusy != true)//判斷BackgroundWorker 是否正在運行異步操作。 { // Start the asynchronous operation. backgroundWorker1.RunWorkerAsync("object argument");//啟動異步操作,有兩種重載。將觸發(fā)BackgroundWorker.DoWork事件 } } //終止 private void btnEnd_Click(object sender, EventArgs e) { if (backgroundWorker1.WorkerSupportsCancellation == true) { // Cancel the asynchronous operation. backgroundWorker1.CancelAsync(); //請求取消掛起的后臺操作。調用該方法將使BackgroundWorker.CancellationPending屬性設置為True。 } }
總結
以上所述是小編給大家介紹的C#中backgroundworker的使用教程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
上一篇:C#自定義IP輸入框控件
欄 目:C#教程
下一篇:C#對Word文檔的創(chuàng)建、插入表格、設置樣式等操作實例
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5194.html
您可能感興趣的文章
- 01-10C#通過反射獲取當前工程中所有窗體并打開的方法
- 01-10關于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線程的方法
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新聞效果的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實現(xiàn)多線程下載文件的方法


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實例總結
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery