【Winform】使用BackgroundWorker控制进度条显示进度

时间:2021-12-23 17:36:08

许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单。。。看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu.com/s/1dDIxHvz

BackgroundWorker可以在代码中创建,也可以在工具箱中拖,但如果要使用,必须将其的WorkerReportsProgress属性设置为True!

这个Demo是一个复制文件的,为了效果更明显,建议复制的文件多一点,方便进度条显示。

界面如下:

【Winform】使用BackgroundWorker控制进度条显示进度

下面是全部代码:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace Demo_ProgressBar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} string[] fileNames = null;//存储文件路径
string savePath = null;//存储保存路径 private void btnChooseFiles_Click(object sender, EventArgs e)//添加文件到listBox
{
OpenFileDialog o = new OpenFileDialog();//打开文件对话框的对象
o.Multiselect = true;//文件可以多选
o.ShowDialog();
if (o.FileNames == null)//如果没有选择文件
{
return;
}
else
{
fileNames = o.FileNames;
for (int i = ; i < fileNames.Length; i++)
{
if (!lstbxShowFiles.Items.Contains(fileNames[i]))//如果列表中不包含元素才添加
{
lstbxShowFiles.Items.Add(fileNames[i]);
}
}
}
} private void btnChooseSavePath_Click(object sender, EventArgs e)//选择保存路径
{
FolderBrowserDialog f = new FolderBrowserDialog();//选择路径
f.ShowDialog();
if (f.SelectedPath == null)
{
return;
}
else
{
txtSavePath.Text = savePath = f.SelectedPath;
}
} private void btnStart_Click(object sender, EventArgs e)//开始复制
{
prgrsbr1.Maximum = lstbxShowFiles.Items.Count;//让进度条的最大值等于列表中要复制的文件的数目
for (int i = ; i < lstbxShowFiles.Items.Count; i++)
{
using (FileStream fsRead = new FileStream(fileNames[i], FileMode.OpenOrCreate, FileAccess.Read))//读取文件流
{
using (FileStream fsWrite = new FileStream(savePath + "\\" + Path.GetFileName(fileNames[i]), FileMode.OpenOrCreate, FileAccess.Write))//写入文件流
{
byte[] buffer = new byte[];
while (fsRead.Read(buffer, , buffer.Length) != )//返回值为零表示读完
{
fsWrite.Write(buffer, , buffer.Length);
}
}
}
bckgrdwkrReport.ReportProgress(i + );//报告进度,触发ProgressChanged事件
}
prgrsbr1.Value = ;
MessageBox.Show("复制成功");
lstbxShowFiles.Items.Clear();
txtSavePath.Clear();
fileNames = null;
savePath = null;
} private void bckgrdwkrReport_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
prgrsbr1.Value = e.ProgressPercentage;//e.ProgressPercentage:ReportProgress方法传递的参数
}
}
}

主要用到BackgroundWorker是在第60行的方法。(不知道前两个方法的自行百度。。。不知using()和FileStream的自行百度)

在62行,我们让进度条的最大值等于列表中要复制的文件的数目,这样每复制完一个文件就在76行用ReportProgress方法报告进度并触发BackgroundWorker的ProgressChanged事件,通过事件的参数e.ProgressPercentage可以获取ReportProgress方法中的参数。

当然,BackgroundWorker还有其他的方法和事件,可以自己去尝试,但一般只用到ReportProgress方法和ProgressChanged事件。