C# 实战 WinForm 窗体应用进度条设计详解
|
admin
2025年3月23日 7:36
本文热度 169
|
前言
在执行耗时较长的任务时,增加一个进度条来显示任务的进度,能够显著提升用户体验。如果没有进度条,用户可能会误以为程序运行出错或死机了。
本文将通过一个简单的示例,详细介绍如何在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 编辑过