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