C#中backgroundworker的使用教程
介紹:
根據(jù)MSDN介紹:
BackgroundWorker 類允許您在單獨(dú)的專用線程上運(yùn)行操作。 耗時(shí)的操作(如下載和數(shù)據(jù)庫(kù)事務(wù))在長(zhǎng)時(shí)間運(yùn)行時(shí)可能會(huì)導(dǎo)致用戶界面 (UI) 似乎處于停止響應(yīng)狀態(tài)。 如果您需要能進(jìn)行響應(yīng)的用戶界面,而且面臨與這類操作相關(guān)的長(zhǎng)時(shí)間延遲,則可以使用 BackgroundWorker 類方便地解決問(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 事件處理程序中不操作任何用戶界面對(duì)象。 而應(yīng)該通過(guò) ProgressChanged 和 RunWorkerCompleted 事件與用戶界面進(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)度信息。如果用戶還想傳遞更多的信息,可以使用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è)置為True。
}
}
總結(jié)
以上所述是小編給大家介紹的C#中backgroundworker的使用教程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
C#實(shí)現(xiàn)將RTF轉(zhuǎn)為HTML的示例代碼
RTF文檔即富文本格式(Rich?Text?Format)的文檔。我們?cè)谔幚砦募r(shí),遇到需要對(duì)文檔格式進(jìn)行轉(zhuǎn)換時(shí),可以將RTF轉(zhuǎn)為其他格式,如轉(zhuǎn)為DOCX/DOC、PDF或者HTML。本文將利用C#實(shí)現(xiàn)RTF轉(zhuǎn)HTML,需要的可以參考一下2022-04-04
c#獲取光標(biāo)在屏幕中位置的簡(jiǎn)單實(shí)例
這篇文章主要介紹了c#獲取光標(biāo)在屏幕中位置的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-12-12

