C#Winform窗体应用的进度条设计示例
				
									
					
					
						|  | 
							admin 2025年1月6日 21:8
								本文热度 1841 | 
					
				 
				在执行耗时较长的任务时,增加一个进度条显示任务的进度,能够给用户一个很好的体验,如果没有进度条显示进度,用户会误以为程序运行出错或死机了。那么在C#winform窗体应用程序中如何设计一个进度条呢,以下以一个简单的demo说明过程。下面这个demo主要由三部分组成:主窗体、进度显示窗体、执行任务的C#类。先来设计主窗体,主窗体只设置一个按钮。注意:网上某些文章还在主窗体里设置了BackgroundWorker控件,我不建议直接使用BackgroundWorker控件,因为使用这个控件后,如果执行任务过程中临时取消任务,然后再次想要重启任务时会出现错误“此 BackgroundWorker 当前正忙,无法同时运行多个任务”。这是因为使用控件时,BackgroundWorker对象成为一个固定的对象。在本demo中,直接在主窗体的按钮点击事件中用new方法创建BackgroundWorker对象,每次点击按钮都产生不同的BackgroundWorker对象。
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Test
{
    public partial class Form1 : 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_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message);
            }
            else if (e.Cancelled)
            {
                this.worker.CancelAsync();
            }
            else
            {
            }
        }
 
    }
}
进度条显示窗体,由一个processbar控件和一个按钮组成,界面如下:
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace Test
{
    public partial class ProcessForm : 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秒的任务,全部代码如下:using System.ComponentModel;
using System.Threading;
namespace Test
{
    internal class DataOperate
    {
        public void operating(BackgroundWorker worker)
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(1000);
                worker.ReportProgress(i*100/10);
            }
        }
    }
}
程序运行后,点击“开始”按钮,就会弹出进度条显示进度,点击“取消”可取消任务,取消任务后可再次点击“开始”再次执行任务。
阅读原文:原文链接
该文章在 2025/1/7 11:42:10 编辑过