【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] Populating Next Right Pointers in Each Node II 每个节点的右向指针之二
Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...
- [LeetCode] Merge Two Sorted Lists 混合插入有序链表
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- php测试
Php基础知识测试题 姓名: 班级: 成绩: 本试题共40道选择题,10道判断题,考试时间1个半小时 一:选择题(单项选择,每题2分): 1. LAMP具体结构不包含下面哪种(A ) A:Windo ...
- webuploader 谷歌浏览器跨域
今天在本地调试webuploader 的image-upload demo时遇到跨域问题(本地post数据到同事的机器中) 会出现No 'Access-Control-Allow-Origin' he ...
- 【Quartz】将定时任务持久化到数据库
之前的文章所做的demo是将定时任务的信息保存在内存中的,见以下配置 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 如果,我们需要在 ...
- c语言之I/O函数
c语言中常用的I/O函数 最常用的字符串的标准I/O函数有getchar().putchar().gets().puts().scanf().printf().fputs().fgets().getc ...
- 记lrd的高二上学期第五次调研考试
河北某某中学的调研考试其实是很好玩的经历呢.可惜没有太多机会了. 背景: NOIP2016回来之后没有好好学文化课-.自习能翘就翘了,衡中特产学案自助没有好好写(说来我好像从来没被老师查到过,上课写学 ...
- bootstrap在jsp中的应用
http://www.bootcss.com/ 下载bootstrap的js,css文件: 在jsp中的应用: 第一步: 新建一个web项目 将bootstrap下载下来的文件放入WEB-INF下面的 ...
- CSS-学习笔记三
绝对定位:1. 脱离了文档流,没有浮动效果2. 默认情况下,设置了绝对定位的块,它的Top,left是相对于浏览器的3. 当给设置了绝对定位的块的父元素设置定位的时候(绝对.相对.固定), 那么 ...
- 第2章 ASP.NET MVC(URL、路由及区域)
* { font: 17px/1.5em "Microsoft YaHei" } ASPNET MVC URL.路由及区域 一.URL.路由及区域 一. 配置路由器 1. ...