前言
在執(zhí)行耗時(shí)較長(zhǎng)的任務(wù)時(shí),增加一個(gè)進(jìn)度條來(lái)顯示任務(wù)的進(jìn)度,能夠顯著提升用戶體驗(yàn)。如果沒(méi)有進(jìn)度條,用戶可能會(huì)誤以為程序運(yùn)行出錯(cuò)或死機(jī)了。
本文將通過(guò)一個(gè)簡(jiǎn)單的示例,詳細(xì)介紹如何在C# WinForm應(yīng)用程序中設(shè)計(jì)和實(shí)現(xiàn)進(jìn)度條。
正文
1、示例結(jié)構(gòu)
主窗體:包含一個(gè)按鈕,用于啟動(dòng)任務(wù)。
進(jìn)度顯示窗體:用于顯示任務(wù)的進(jìn)度條。
執(zhí)行任務(wù)的C#類:包含實(shí)際的任務(wù)邏輯。
2、主窗體設(shè)計(jì)
首先,我們來(lái)設(shè)計(jì)主窗體。主窗體只需設(shè)置一個(gè)按鈕,用于觸發(fā)任務(wù)的執(zhí)行。
需要注意的是,網(wǎng)上某些文章建議直接在主窗體中使用BackgroundWorker控件,但這可能會(huì)導(dǎo)致一些問(wèn)題,例如:
重復(fù)任務(wù)沖突:如果在任務(wù)執(zhí)行過(guò)程中臨時(shí)取消任務(wù),然后再次嘗試啟動(dòng)任務(wù)時(shí),會(huì)遇到錯(cuò)誤提示:"此 BackgroundWorker 當(dāng)前正忙,無(wú)法同時(shí)運(yùn)行多個(gè)任務(wù)"。
為了避免這些問(wèn)題,我們?cè)诿看吸c(diǎn)擊按鈕時(shí)動(dòng)態(tài)創(chuàng)建新的BackgroundWorker對(duì)象,而不是使用固定的控件實(shí)例。
主窗體界面如下圖:

主窗體的全部代碼如下:
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)建一個(gè)Backgroundworker,設(shè)置其參數(shù)
this.worker = new BackgroundWorker();
worker.DoWork +=
new DoWorkEventHandler(backgroundwork);
//執(zhí)行工作時(shí),綁定對(duì)應(yīng)的方法
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
//工作完成時(shí),綁定對(duì)應(yīng)的方法
worker.WorkerReportsProgress=true;
//允許報(bào)告進(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í)行實(shí)際任務(wù)的類
dataOperate.operating(worker);
//傳入worker,以便于報(bào)告進(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)度條顯示窗體,由一個(gè)processbar控件和一個(gè)按鈕組成,界面如下:
對(duì)應(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)閉頁(yè)面
}
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í)行耗時(shí)任務(wù)的類DataOperate.cs,這里模擬了一個(gè)耗時(shí)10秒的任務(wù),全部代碼如下:
程序運(yùn)行后,點(diǎn)擊"開始"按鈕,就會(huì)彈出進(jìn)度條顯示進(jìn)度,點(diǎn)擊"取消"可取消任務(wù),取消任務(wù)后可再次點(diǎn)擊“開始”再次執(zhí)行任務(wù)。

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