在C#中,BackgroundWorker類用于在后臺線程上執行任務,以避免阻塞UI線程。當需要在后臺線程上更新UI時,需要使用Control.Invoke或Control.BeginInvoke方法將更新委托到UI線程。
以下是一個簡單的示例,說明如何使用BackgroundWorker處理UI更新:
首先,創建一個新的Windows Forms應用程序,并在設計器中添加一個Button和一個Label控件。
為Button控件添加一個Click事件處理程序,以便在單擊按鈕時啟動BackgroundWorker。
在代碼中,創建一個BackgroundWorker實例,并設置其DoWork和RunWorkerCompleted事件處理程序。
public partial class Form1 : Form
{
private BackgroundWorker backgroundWorker;
public Form1()
{
InitializeComponent();
// 創建BackgroundWorker實例
backgroundWorker = new BackgroundWorker();
// 設置DoWork事件處理程序
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
// 設置RunWorkerCompleted事件處理程序
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
}
private void button1_Click(object sender, EventArgs e)
{
// 開始執行后臺任務
backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// 在后臺線程上執行任務
for (int i = 0; i < 10; i++)
{
// 更新UI前,使用Control.Invoke將更新委托到UI線程
this.Invoke((MethodInvoker)delegate
{
label1.Text = $"正在處理: {i + 1}";
});
// 模擬耗時操作
System.Threading.Thread.Sleep(500);
}
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// 在后臺任務完成后,更新UI
this.Invoke((MethodInvoker)delegate
{
label1.Text = "完成";
});
}
}
在這個示例中,當用戶單擊按鈕時,BackgroundWorker將開始執行后臺任務。在后臺線程上,我們使用Control.Invoke將更新委托到UI線程,以便在Label控件上顯示處理進度。當后臺任務完成時,我們再次使用Control.Invoke更新Label控件以顯示“完成”。