【Winform】使用BackgroundWorker控制进度条显示进度
许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单。。。看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu.com/s/1dDIxHvz
BackgroundWorker可以在代码中创建,也可以在工具箱中拖,但如果要使用,必须将其的WorkerReportsProgress属性设置为True!
这个Demo是一个复制文件的,为了效果更明显,建议复制的文件多一点,方便进度条显示。
界面如下:

下面是全部代码:
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事件。
【Winform】使用BackgroundWorker控制进度条显示进度的更多相关文章
- Ajax上传文件进度条显示
		
要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...
 - 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示
		
尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...
 - Extjs 使用fileupload插件上传文件  带进度条显示
		
一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...
 - Qt flash_eraseall nandwrite 进度条显示擦除、烧录
		
/***************************************************************************** * Qt flash_eraseall n ...
 - MFC读写.txt文件时进度条显示实时进度
		
整体实现方式:先获得文件长度,然后用每次读取的长度,计算出完成的百分比,用百分比的值设置进度条. 一.MFC进度条 Progress Control 相关函数 1. create() --创建Prog ...
 - Android——音乐播放器完善——进度条显示当前播放进度,加可拖动进度条(未待解决完问题)
		
效果: 问题:可拖动进度条随进度条移动时,会致使音乐卡顿(待解决) xml <?xml version="1.0" encoding="utf-8"?&g ...
 - Android中ProgressBar的使用-通过Handler与Message实现进度条显示
		
场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为 ...
 - 实现winfrom进度条及进度信息提示,winfrom程序假死处理
		
1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...
 - 实现winfrom进度条及进度信息提示
		
1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...
 
随机推荐
- [LeetCode] Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
			
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
 - C++远征之封装篇(下)
			
对象数组 类 x1[]; 栈中实例化,不用delete. 类 *X=new X[];//在堆中实例化,结尾需要用delete删除 delete []X; //这是数组的删除形式 X=NULL;
 - laravel下的数据序列化
			
$data=$this->user->get(); //is obj $data=(string)$data; //is string $data=$data->toArray(); ...
 - HV000030: No validator could be found for type: java.lang.Integer.
			
在写接口时,一般去查找在类的Integer属性上加了不属于整型的校验,比如@NotEmpty,@Length等 @JSONField(name = "deviceNum") @No ...
 - Ubuntu中配置Java环境变量时,出现command not found问题解决记录
			
百度出Ubuntu中配置Java环境变量时,在利用sudo gedit /etc/profile 对profile编辑后, 在terminal中输入 sudo source /etc/profile, ...
 - c++中的lambda特性
			
来源: http://www.jb51.net/article/56147.htm cocos2dx3.0测试: 1.有参数a,b printf("lambda=%lf", []( ...
 - Matlab中^2和.^2的区别
			
矩阵a a^2 -- 两个矩阵相乘 a.^2 -- 表示 矩阵对应位置相乘 如下: a=[ 1,2,3 4,5,6 7,8,9]; disp(a); disp(a^2); disp(a.^2); ...
 - 我的博客CSS
			
这个是按照custom标准模板来做的,博客园已经有模版了,有些细节不是很好,这个是源CSS,喜欢的可以自由DIY,完善更好. @charset "utf-8"; /* CSS Do ...
 - javadoc
			
Oracle官方javadoc说明 Generates HTML pages of API documentation from Java source files. http://docs.orac ...
 - pageX、clientX、screenX、offsetX、layerX、x
			
参考:http://www.cnblogs.com/xesam/archive/2011/12/08/2280509.html chrome: e.pageX--相对整个页面的坐标e.layerX-- ...