摘要
BackgroundWorker 是一個(gè)重要的 Windows 應(yīng)用程序開發(fā)組件,它允許你在后臺執(zhí)行耗時(shí)的操作,而不會阻塞應(yīng)用程序的主 UI 線程。通過使用 BackgroundWorker,你可以使你的應(yīng)用程序更加靈活,更加高效。
BackgroundWorker 組件是通過委托和異步編程技術(shù)實(shí)現(xiàn)的。你可以在組件的主類中定義一個(gè)輔助方法,該方法會在后臺執(zhí)行,同時(shí)不會阻塞調(diào)用線程。這些輔助方法是異步的,因此它們不會阻塞 UI 線程。相反,調(diào)用線程可以繼續(xù)執(zhí)行其他任務(wù),直到異步方法完成。
一旦你定義了一個(gè)輔助方法,你可以使用 RunWorkerAsync 方法將其作為異步任務(wù)提交給 BackgroundWorker。在調(diào)用該方法時(shí),BackgroundWorker 將創(chuàng)建一個(gè)線程池線程來執(zhí)行輔助方法。在輔助方法運(yùn)行時(shí),調(diào)用線程將繼續(xù)執(zhí)行其他任務(wù),而不會阻塞。
當(dāng)輔助方法完成時(shí),BackgroundWorker 將引發(fā)一個(gè)事件。這個(gè)事件是可選的,但它可以包含有關(guān)輔助方法運(yùn)行的信息,例如耗時(shí),狀態(tài)和錯(cuò)誤消息。如果你不需要事件,你可以使用 RunWorkerCompleted 方法立即結(jié)束任務(wù)。
BackgroundWorker 是一個(gè)非常有用的組件,它可以幫助你編寫高效的異步代碼。它使你能夠在后臺執(zhí)行耗時(shí)的操作,而不會阻塞 UI 線程,這對于實(shí)現(xiàn)響應(yīng)式和流暢的應(yīng)用程序非常重要。無論你是編寫 Web 應(yīng)用程序,移動應(yīng)用程序還是桌面應(yīng)用程序,BackgroundWorker 都是一個(gè)值得使用的工具。
正文
屬性
|
|
---|
CancellationPending | 獲取一個(gè)值,指示應(yīng)用程序是否已請求取消后臺操作。 |
CanRaiseEvents | 獲取一個(gè)指示組件是否可以引發(fā)事件的值。 |
Events | 獲取附加到此 Component 的事件處理程序的列表。 |
IsBusy | 獲取一個(gè)值,指示 BackgroundWorker 是否正在運(yùn)行異步操作。 |
WorkerReportsProgress | 獲取或設(shè)置一個(gè)值,該值指示 BackgroundWorker 能否報(bào)告進(jìn)度更新。 |
WorkerSupportsCancellation | 獲取或設(shè)置一個(gè)值,該值指示 BackgroundWorker 是否支持異步取消。 |
方法
|
|
---|
CancelAsync() | 請求取消掛起的后臺操作。 |
OnDoWork(DoWorkEventArgs) | 引發(fā) DoWork 事件。 |
OnProgressChanged(ProgressChangedEventArgs) | 引發(fā) ProgressChanged 事件。 |
OnRunWorkerCompleted(RunWorkerCompletedEventArgs) | 引發(fā) RunWorkerCompleted 事件。 |
ReportProgress(Int32) | 引發(fā) ProgressChanged 事件。 |
ReportProgress(Int32, Object) | 引發(fā) ProgressChanged 事件。 |
RunWorkerAsync() | 開始執(zhí)行后臺操作。 |
RunWorkerAsync(Object) | 開始執(zhí)行后臺操作。 |
實(shí)例化
//實(shí)例化BackgroundWorker
private BackgroundWorker bgWorker = new BackgroundWorker();
初使化
private void FrmMain_Load(object sender, EventArgs e)
{
pbar.Maximum = 1000;
//是否報(bào)告處理進(jìn)度
bgWorker.WorkerReportsProgress = true;
//是否允許取消操作
bgWorker.WorkerSupportsCancellation = true;
//執(zhí)行三個(gè)事件,DoWork事件,ProgressChanged事件以及RunWorkedCompleted事件
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);
}
事件
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//設(shè)置進(jìn)度條Maximum為1000,循環(huán)1000次
for (int i = 0; i <= 1000; i++)
{
//獲取是否取消操作
if (bgWorker.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
//報(bào)告進(jìn)度
bgWorker.ReportProgress(i, "Working");
System.Threading.Thread.Sleep(10);
}
}
}
public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
{
//e.ProgressPercentage是獲取任務(wù)int類型
pbar.Value = e.ProgressPercentage;
lblTitle.Text = "處理進(jìn)度:" + Convert.ToString(e.ProgressPercentage);
}
public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//若沒有完全執(zhí)行結(jié)束,則報(bào)錯(cuò)
if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
return;
}
if (!e.Cancelled)
this.lblTitle.Text = "處理完畢!";
else
this.lblTitle.Text = "處理終止!";
}
//開始
private void btnStart_Click(object sender, EventArgs e)
{
//正忙時(shí)不允許繼續(xù)操作
if (bgWorker.IsBusy)
return;
//異步開啟
bgWorker.RunWorkerAsync("start");
}
//停止
private void btnStop_Click(object sender, EventArgs e)
{
bgWorker.CancelAsync();
}
該文章在 2024/1/13 17:10:02 編輯過