国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中backgroundworker的使用教程

2019-10-29 21:06:04
字體:
來源:轉載
供稿:網友

介紹:

根據MSDN介紹:

         BackgroundWorker 類允許您在單獨的專用線程上運行操作。 耗時的操作(如下載和數據庫事務)在長時間運行時可能會導致用戶界面 (UI) 似乎處于停止響應狀態。 如果您需要能進行響應的用戶界面,而且面臨與這類操作相關的長時間延遲,則可以使用 BackgroundWorker 類方便地解決問題。

       若要在后臺執行耗時的操作,請創建一個 BackgroundWorker,偵聽那些報告操作進度并在操作完成時發出信號的事件。 可以通過編程方式創建 BackgroundWorker,也可以將它從“工具箱”的“組件”選項卡中拖到窗體上。 如果在 Windows 窗體設計器中創建 BackgroundWorker,則它會出現在組件欄中,而且它的屬性會顯示在“屬性”窗口中。

       若要為后臺操作做好準備,請添加 DoWork 事件的事件處理程序。 在此事件處理程序中調用耗時的操作。 若要開始此操作,請調用 RunWorkerAsync。 若要收到進度更新的通知,請處理 ProgressChanged 事件。 若要在操作完成時收到通知,請處理 RunWorkerCompleted 事件。

有2點需要注意的:

   1、由于DoWork事件內部的代碼運行在非UI線程之上,確保在 DoWork 事件處理程序中不操作任何用戶界面對象。 而應該通過 ProgressChanged 和 RunWorkerCompleted 事件與用戶界面進行通信。

   2、BackgroundWorker 事件不跨 AppDomain 邊界進行封送處理。 請不要使用 BackgroundWorker 組件在多個 AppDomain 中執行多線程操作。

使用:

運行顯示:

#14a675c42d9185c117091029e30dcb9c#

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 獲取異步操作參數的值  //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");// 將觸發BackgroundWorker.ProgressChanged事件,向ProgressChanged報告進度   }  }  e.Result = "結束"; } 

RunWorkerCompleted事件:當DoWork事件處理完成之后,將會觸發該事件。

private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) {  //e.Cancelled指示異步操作是否已被取消  //e.Error 指示異步操作期間發生的錯誤  //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事件處理程序的第二個參數e有一個ProgressPercentage屬性,它就由 ReportProgress的第一個參數percentProgress來提供。這個參數一般用來報告該后臺操作完成的進度,然后用ProgressChanged的第二個參數e的ProgressPercentage屬性來獲取該進度信息。如果用戶還想傳遞更多的信息,可以使用ReportProgress的第二種重載,它的第二個參數userState將會傳遞給ProgressChanged事件的參數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");//啟動異步操作,有兩種重載。將觸發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的使用教程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新巴尔虎左旗| 顺昌县| 莱州市| 桂阳县| 平果县| 镇赉县| 外汇| 平江县| 安国市| 灵宝市| 绥德县| 门源| 济南市| 道真| 慈利县| 东光县| 广南县| 陈巴尔虎旗| 吉安市| 永寿县| 遂昌县| 安岳县| 出国| 桓台县| 泉州市| 利辛县| 蓬安县| 开封县| 莱芜市| 长沙县| 长治县| 甘南县| 建阳市| 和政县| 克拉玛依市| 曲麻莱县| 庐江县| 朝阳市| 天台县| 峡江县| 东乌珠穆沁旗|