前言
在執(zhí)行耗時較長的任務(wù)時,增加一個進(jìn)度條來顯示任務(wù)的進(jìn)度,能夠顯著提升用戶體驗。如果沒有進(jìn)度條,用戶可能會誤以為程序運(yùn)行出錯或死機(jī)了。
本文將通過一個簡單的示例,詳細(xì)介紹如何在C# WinForm應(yīng)用程序中設(shè)計和實現(xiàn)進(jìn)度條。
正文
1、示例結(jié)構(gòu)
主窗體:包含一個按鈕,用于啟動任務(wù)。
進(jìn)度顯示窗體:用于顯示任務(wù)的進(jìn)度條。
執(zhí)行任務(wù)的C#類:包含實際的任務(wù)邏輯。
2、主窗體設(shè)計
首先,我們來設(shè)計主窗體。主窗體只需設(shè)置一個按鈕,用于觸發(fā)任務(wù)的執(zhí)行。
需要注意的是,網(wǎng)上某些文章建議直接在主窗體中使用BackgroundWorker控件,但這可能會導(dǎo)致一些問題,例如:
重復(fù)任務(wù)沖突:如果在任務(wù)執(zhí)行過程中臨時取消任務(wù),然后再次嘗試啟動任務(wù)時,會遇到錯誤提示:"此 BackgroundWorker 當(dāng)前正忙,無法同時運(yùn)行多個任務(wù)"。
為了避免這些問題,我們在每次點擊按鈕時動態(tài)創(chuàng)建新的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)
{
//創(chuàng)建一個Backgroundworker,設(shè)置其參數(shù)
this.worker = new BackgroundWorker();
worker.DoWork +=
new DoWorkEventHandler(backgroundwork);
//執(zhí)行工作時,綁定對應(yīng)的方法
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
//工作完成時,綁定對應(yīng)的方法
worker.WorkerReportsProgress=true;
//允許報告進(jìn)度
worker.WorkerSupportsCancellation=true;
//支持中途取消
//開始執(zhí)行操作
worker.RunWorkerAsync();
ProcessForm form = new ProcessForm(worker);
// 顯示進(jìn)度條窗體
form.ShowDialog(this);
form.Close();
}
private void backgroundwork
(object sender, DoWorkEventArgs e)
{
DataOperate dataOperate = new DataOperate();
//執(zhí)行實際任務(wù)的類
dataOperate.operating(worker);
//傳入worker,以便于報告進(jìn)度
}
private void backgroundWorker1_RunWorkerComplete
(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
elseif (e.Cancelled)
{
this.worker.CancelAsync();
}
else
{
}
}
}
}
進(jìn)度條顯示窗體,由一個processbar控件和一個按鈕組成,界面如下:
對應(yīng)的全部代碼如下:
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();
//執(zhí)行完之后,直接關(guān)閉頁面
}
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();
}
}
}
最后,是執(zhí)行耗時任務(wù)的類DataOperate.cs,這里模擬了一個耗時10秒的任務(wù),全部代碼如下:
程序運(yùn)行后,點擊"開始"按鈕,就會彈出進(jìn)度條顯示進(jìn)度,點擊"取消"可取消任務(wù),取消任務(wù)后可再次點擊“開始”再次執(zhí)行任務(wù)。

總結(jié)
在C# WinForm應(yīng)用開發(fā)中,進(jìn)度條是一個非常有用的UI組件,它能夠直觀地展示任務(wù)的執(zhí)行進(jìn)度,提升用戶體驗。
本文通過詳細(xì)的步驟和示例代碼,介紹了如何在WinForm應(yīng)用中設(shè)計和實現(xiàn)進(jìn)度條。
閱讀原文:原文鏈接
該文章在 2025/3/24 16:49:22 編輯過