在 C# Windows Forms 應用程序中,如果在后臺執行長時間運行的任務,并希望同時更新進度條,可以使用多線程來實現。這將確保進度條的更新不會阻塞主線程,從而保持界面的響應性。以下是一個示例,演示了如何在后臺執行任務并更新進度條。
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
namespace BackgroundWorkerExample
{
? ? public partial class MainForm : Form
? ? {
? ? ? ? private BackgroundWorker worker;
? ? ? ? public MainForm()
? ? ? ? {
? ? ? ? ? ? InitializeComponent();
? ? ? ? ? ? worker = new BackgroundWorker();
? ? ? ? ? ? worker.WorkerReportsProgress = true;
? ? ? ? ? ? worker.DoWork += Worker_DoWork;
? ? ? ? ? ? worker.ProgressChanged += Worker_ProgressChanged;
? ? ? ? ? ? worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
? ? ? ? }
? ? ? ? private void StartButton_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? if (!worker.IsBusy)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? worker.RunWorkerAsync();
? ? ? ? ? ? ? ? StartButton.Enabled = false;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? private void Worker_DoWork(object sender, DoWorkEventArgs e)
? ? ? ? {
? ? ? ? ? ? for (int i = 0; i <= 100; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Thread.Sleep(50); // 模擬任務的延遲
? ? ? ? ? ? ? ? worker.ReportProgress(i);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
? ? ? ? {
? ? ? ? ? ? progressBar1.Value = e.ProgressPercentage;
? ? ? ? }
? ? ? ? private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
? ? ? ? {
? ? ? ? ? ? StartButton.Enabled = true;
? ? ? ? ? ? MessageBox.Show("任務完成!");
? ? ? ? }
? ? }
}
?
在這個示例中,使用了 `BackgroundWorker` 組件來在后臺執行任務并更新進度條。`BackgroundWorker` 組件允許使用事件來管理后臺工作的不同階段。
在 `Worker_DoWork` 方法中,執行模擬任務并使用 `worker.ReportProgress` 方法報告進度。在 `Worker_ProgressChanged` 方法中,我們更新進度條的值。最后,在 `Worker_RunWorkerCompleted` 方法中,啟用“開始”按鈕并顯示任務完成的消息。