前言
在執行耗時較長的任務時,增加一個進度條來顯示任務的進度,能夠顯著提升用戶體驗。如果沒有進度條,用戶可能會誤以為程序運行出錯或死機了。
本文將通過一個簡單的示例,詳細介紹如何在C# WinForm應用程序中設計和實現進度條。
正文
1、示例結構
主窗體:包含一個按鈕,用于啟動任務。
進度顯示窗體:用于顯示任務的進度條。
執行任務的C#類:包含實際的任務邏輯。
2、主窗體設計
首先,我們來設計主窗體。主窗體只需設置一個按鈕,用于觸發任務的執行。
需要注意的是,網上某些文章建議直接在主窗體中使用BackgroundWorker控件,但這可能會導致一些問題,例如:
重復任務沖突:如果在任務執行過程中臨時取消任務,然后再次嘗試啟動任務時,會遇到錯誤提示:"此 BackgroundWorker 當前正忙,無法同時運行多個任務"。
為了避免這些問題,我們在每次點擊按鈕時動態創建新的BackgroundWorker對象,而不是使用固定的控件實例。
主窗體界面如下圖:

主窗體的全部代碼如下:
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespaceTest
{
publicpartialclassForm1 : Form
{
public Form1(
)
{
InitializeComponent();
}
public BackgroundWorker worker;
private void button1_Click
(object sender, EventArgs e)
{
//創建一個Backgroundworker,設置其參數
this.worker = new BackgroundWorker();
worker.DoWork +=
new DoWorkEventHandler(backgroundwork);
//執行工作時,綁定對應的方法
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
//工作完成時,綁定對應的方法
worker.WorkerReportsProgress=true;
//允許報告進度
worker.WorkerSupportsCancellation=true;
//支持中途取消
//開始執行操作
worker.RunWorkerAsync();
ProcessForm form = new ProcessForm(worker);
// 顯示進度條窗體
form.ShowDialog(this);
form.Close();
}
private void backgroundwork
(object sender, DoWorkEventArgs e)
{
DataOperate dataOperate = new DataOperate();
//執行實際任務的類
dataOperate.operating(worker);
//傳入worker,以便于報告進度
}
private void backgroundWorker1_RunWorkerComplete
(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
elseif (e.Cancelled)
{
this.worker.CancelAsync();
}
else
{
}
}
}
}
進度條顯示窗體,由一個processbar控件和一個按鈕組成,界面如下:
對應的全部代碼如下:
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespaceTest
{
publicpartialclassProcessForm : Form
{
private BackgroundWorker backgroundWorker1;
public ProcessForm(BackgroundWorker backgroundWorker1)
{
InitializeComponent();
this.backgroundWorker1 = backgroundWorker1;
this.backgroundWorker1.ProgressChanged +=
new ProgressChangedEventHandler
(backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler
(backgroundWorker1_RunWorkerCompleted);
}
private void ProcessForm_Load(object sender, EventArgs e)
{
}
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Close();
//執行完之后,直接關閉頁面
}
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
private void button1_Click_1(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
this.button1.Enabled = false;
this.Close();
}
}
}
最后,是執行耗時任務的類DataOperate.cs,這里模擬了一個耗時10秒的任務,全部代碼如下:
程序運行后,點擊"開始"按鈕,就會彈出進度條顯示進度,點擊"取消"可取消任務,取消任務后可再次點擊“開始”再次執行任務。

總結
在C# WinForm應用開發中,進度條是一個非常有用的UI組件,它能夠直觀地展示任務的執行進度,提升用戶體驗。
本文通過詳細的步驟和示例代碼,介紹了如何在WinForm應用中設計和實現進度條。
閱讀原文:原文鏈接
該文章在 2025/3/24 16:49:22 編輯過