欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中backgroundworker的使用教程

 更新時(shí)間:2018年04月20日 15:56:58   作者:秋漓  
這篇文章主要介紹了C#中backgroundworker的使用教程,在文中有兩點(diǎn)需要注意的,大家可以看下

介紹:

根據(jù)MSDN介紹:

         BackgroundWorker 類(lèi)允許您在單獨(dú)的專(zhuān)用線程上運(yùn)行操作。 耗時(shí)的操作(如下載和數(shù)據(jù)庫(kù)事務(wù))在長(zhǎng)時(shí)間運(yùn)行時(shí)可能會(huì)導(dǎo)致用戶(hù)界面 (UI) 似乎處于停止響應(yīng)狀態(tài)。 如果您需要能進(jìn)行響應(yīng)的用戶(hù)界面,而且面臨與這類(lèi)操作相關(guān)的長(zhǎng)時(shí)間延遲,則可以使用 BackgroundWorker 類(lèi)方便地解決問(wèn)題。

       若要在后臺(tái)執(zhí)行耗時(shí)的操作,請(qǐng)創(chuàng)建一個(gè) BackgroundWorker,偵聽(tīng)那些報(bào)告操作進(jìn)度并在操作完成時(shí)發(fā)出信號(hào)的事件。 可以通過(guò)編程方式創(chuàng)建 BackgroundWorker,也可以將它從“工具箱”的“組件”選項(xiàng)卡中拖到窗體上。 如果在 Windows 窗體設(shè)計(jì)器中創(chuàng)建 BackgroundWorker,則它會(huì)出現(xiàn)在組件欄中,而且它的屬性會(huì)顯示在“屬性”窗口中。

       若要為后臺(tái)操作做好準(zhǔn)備,請(qǐng)?zhí)砑?DoWork 事件的事件處理程序。 在此事件處理程序中調(diào)用耗時(shí)的操作。 若要開(kāi)始此操作,請(qǐng)調(diào)用 RunWorkerAsync。 若要收到進(jìn)度更新的通知,請(qǐng)?zhí)幚?ProgressChanged 事件。 若要在操作完成時(shí)收到通知,請(qǐng)?zhí)幚?RunWorkerCompleted 事件。

有2點(diǎn)需要注意的:

   1、由于DoWork事件內(nèi)部的代碼運(yùn)行在非UI線程之上,確保在 DoWork 事件處理程序中不操作任何用戶(hù)界面對(duì)象。 而應(yīng)該通過(guò) ProgressChanged 和 RunWorkerCompleted 事件與用戶(hù)界面進(jìn)行通信。

   2、BackgroundWorker 事件不跨 AppDomain 邊界進(jìn)行封送處理。 請(qǐng)不要使用 BackgroundWorker 組件在多個(gè) AppDomain 中執(zhí)行多線程操作。

使用:

運(yùn)行顯示:

1、聲明一個(gè)BackgroundWorker

BackgroundWorker backgroundWorker1 = null; 

2、初始化BackgroundWorker,設(shè)置屬性并綁定事件

public Form1() 
{ 
 InitializeComponent(); 
 backgroundWorker1 = new BackgroundWorker(); 
 backgroundWorker1.WorkerReportsProgress = true;//能否報(bào)告進(jìn)度更新。 
 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 是否應(yīng)該取消事件 
 //e.Result 獲取或設(shè)置異步操作結(jié)果的值(在RunWorkerCompleted事件可能會(huì)使用到) 
 object a = e.Argument;//獲取RunWorkerAsync(object argument)傳入的值 
 BackgroundWorker worker = sender as BackgroundWorker; 
    
 for (int i = 1; i <= 10; i++) 
 { 
  if (worker.CancellationPending == true)//在耗時(shí)操作中判斷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報(bào)告進(jìn)度 
  } 
 } 
 e.Result = "結(jié)束"; 
} 

RunWorkerCompleted事件:當(dāng)DoWork事件處理完成之后,將會(huì)觸發(fā)該事件。

private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) 
{ 
 //e.Cancelled指示異步操作是否已被取消 
 //e.Error 指示異步操作期間發(fā)生的錯(cuò)誤 
 //e.Result 獲取異步操作結(jié)果的值,即DoWork事件中,Result設(shè)置的值。 
 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事件處理程序的第二個(gè)參數(shù)e有一個(gè)ProgressPercentage屬性,它就由 ReportProgress的第一個(gè)參數(shù)percentProgress來(lái)提供。這個(gè)參數(shù)一般用來(lái)報(bào)告該后臺(tái)操作完成的進(jìn)度,然后用ProgressChanged的第二個(gè)參數(shù)e的ProgressPercentage屬性來(lái)獲取該進(jìn)度信息。如果用戶(hù)還想傳遞更多的信息,可以使用ReportProgress的第二種重載,它的第二個(gè)參數(shù)userState將會(huì)傳遞給ProgressChanged事件的參數(shù)e的UserState屬性。

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) 
{ 
 //e.ProgressPercentage 獲取異步操作進(jìn)度的百分比 
 resultLabel.Text = (e.ProgressPercentage.ToString() + "%"); 
 string state = (string)e.UserState;//接收ReportProgress方法傳遞過(guò)來(lái)的userState 
}

4、按鈕事件

 //開(kāi)始按鈕 
private void btnStart_Click(object sender, EventArgs e) 
{ 
 if (backgroundWorker1.IsBusy != true)//判斷BackgroundWorker 是否正在運(yùn)行異步操作。 
 { 
  // Start the asynchronous operation. 
  backgroundWorker1.RunWorkerAsync("object argument");//啟動(dòng)異步操作,有兩種重載。將觸發(fā)BackgroundWorker.DoWork事件 
 } 
} 
 //終止 
private void btnEnd_Click(object sender, EventArgs e) 
{ 
 if (backgroundWorker1.WorkerSupportsCancellation == true) 
 { 
  // Cancel the asynchronous operation. 
  backgroundWorker1.CancelAsync(); //請(qǐng)求取消掛起的后臺(tái)操作。調(diào)用該方法將使BackgroundWorker.CancellationPending屬性設(shè)置為T(mén)rue。 
 } 
} 

總結(jié)

以上所述是小編給大家介紹的C#中backgroundworker的使用教程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • C#對(duì)文件進(jìn)行加密解密代碼

    C#對(duì)文件進(jìn)行加密解密代碼

    本文給大家分享的是使用C#對(duì)文件進(jìn)行加密解密的代碼,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-07-07
  • C# 動(dòng)態(tài)調(diào)用WebService的示例

    C# 動(dòng)態(tài)調(diào)用WebService的示例

    這篇文章主要介紹了C# 動(dòng)態(tài)調(diào)用WebService的示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • C# 語(yǔ)言入門(mén)基礎(chǔ)介紹

    C# 語(yǔ)言入門(mén)基礎(chǔ)介紹

    這篇文章主要介紹了C# 語(yǔ)言入門(mén)基礎(chǔ),c#是一種新式編程語(yǔ)言,不僅面向?qū)ο螅€類(lèi)型安全,本教程概述了 C# 8 及更高版本中該語(yǔ)言的主要組件。 下面一起進(jìn)入文章了解更多的詳細(xì)內(nèi)容吧
    2021-12-12
  • C#8.0中新語(yǔ)法“is{}“的介紹及使用小結(jié)

    C#8.0中新語(yǔ)法“is{}“的介紹及使用小結(jié)

    is模式匹配操作符通過(guò)測(cè)試一個(gè)變量是否是一個(gè)對(duì)象,來(lái)判斷其是否不為null值,本文主要介紹了C#8.0中新語(yǔ)法“is{}“的介紹及使用小結(jié),感興趣的可以了解一下
    2023-11-11
  • 利用C#實(shí)現(xiàn)HTML模板的循環(huán)輸出

    利用C#實(shí)現(xiàn)HTML模板的循環(huán)輸出

    模板循環(huán)輸出 ,是指使用 UI 前端設(shè)計(jì)的 HTML 模板片斷,并結(jié)合數(shù)據(jù)記錄進(jìn)行循環(huán)輸出的過(guò)程,本文將介紹如何中通過(guò) C# 實(shí)現(xiàn)操作 HTML 模板的循環(huán)輸出,文章通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • c# winform異步不卡界面的實(shí)現(xiàn)方法

    c# winform異步不卡界面的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于c# winform異步不卡界面的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • .NET/C#實(shí)現(xiàn)識(shí)別用戶(hù)訪問(wèn)設(shè)備的方法

    .NET/C#實(shí)現(xiàn)識(shí)別用戶(hù)訪問(wèn)設(shè)備的方法

    這篇文章主要介紹了.NET/C#實(shí)現(xiàn)識(shí)別用戶(hù)訪問(wèn)設(shè)備的方法,結(jié)合實(shí)例形式分析了C#識(shí)別用戶(hù)訪問(wèn)設(shè)備的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • 淺析C#中不同格式請(qǐng)求的區(qū)別

    淺析C#中不同格式請(qǐng)求的區(qū)別

    form-data?請(qǐng)求和?x-www-form-urlencoded?請(qǐng)求是兩種常見(jiàn)的?HTTP?請(qǐng)求體格式,這篇文章主要為大家詳細(xì)介紹了二者的區(qū)別與應(yīng)用,希望對(duì)大家有所幫助
    2023-08-08
  • C#泛型詳解及關(guān)鍵字作用

    C#泛型詳解及關(guān)鍵字作用

    這篇文章主要來(lái)講講c#中的泛型,因?yàn)榉盒驮赾#中有很重要的位置,對(duì)于寫(xiě)出高可讀性,高性能的代碼有著關(guān)鍵的作用,大家都知道泛型公共語(yǔ)言運(yùn)行庫(kù)是非常重要功能,那么為什么使用泛型呢,帶著這個(gè)問(wèn)題一起通過(guò)本文學(xué)習(xí)下吧
    2021-08-08
  • C#微信公眾號(hào)開(kāi)發(fā)之接收事件推送與消息排重的方法

    C#微信公眾號(hào)開(kāi)發(fā)之接收事件推送與消息排重的方法

    這篇文章主要介紹了C#微信公眾號(hào)開(kāi)發(fā)之接收事件推送與消息排重的方法,詳細(xì)分析了事件推送與消息排重的使用技巧,對(duì)微信開(kāi)發(fā)有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01

最新評(píng)論