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

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

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

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

界面如下:

下面是全部代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.IO;
 7 using System.Linq;
 8 using System.Text;
 9 using System.Threading.Tasks;
10 using System.Windows.Forms;
11
12 namespace Demo_ProgressBar
13 {
14      public partial class Form1 : Form
15      {
16           public Form1()
17           {
18                InitializeComponent();
19           }
20
21           string[] fileNames = null;//存储文件路径
22           string savePath = null;//存储保存路径
23
24           private void btnChooseFiles_Click(object sender, EventArgs e)//添加文件到listBox
25           {
26                OpenFileDialog o = new OpenFileDialog();//打开文件对话框的对象
27                o.Multiselect = true;//文件可以多选
28                o.ShowDialog();
29                if (o.FileNames == null)//如果没有选择文件
30                {
31                     return;
32                }
33                else
34                {
35                     fileNames = o.FileNames;
36                     for (int i = 0; i < fileNames.Length; i++)
37                     {
38                          if (!lstbxShowFiles.Items.Contains(fileNames[i]))//如果列表中不包含元素才添加
39                          {
40                               lstbxShowFiles.Items.Add(fileNames[i]);
41                          }
42                     }
43                }
44           }
45
46           private void btnChooseSavePath_Click(object sender, EventArgs e)//选择保存路径
47           {
48                FolderBrowserDialog f = new FolderBrowserDialog();//选择路径
49                f.ShowDialog();
50                if (f.SelectedPath == null)
51                {
52                     return;
53                }
54                else
55                {
56                     txtSavePath.Text = savePath = f.SelectedPath;
57                }
58           }
59
60           private void btnStart_Click(object sender, EventArgs e)//开始复制
61           {
62                prgrsbr1.Maximum = lstbxShowFiles.Items.Count;//让进度条的最大值等于列表中要复制的文件的数目
63                for (int i = 0; i < lstbxShowFiles.Items.Count; i++)
64                {
65                     using (FileStream fsRead = new FileStream(fileNames[i], FileMode.OpenOrCreate, FileAccess.Read))//读取文件流
66                     {
67                          using (FileStream fsWrite = new FileStream(savePath + "\\" + Path.GetFileName(fileNames[i]), FileMode.OpenOrCreate, FileAccess.Write))//写入文件流
68                          {
69                               byte[] buffer = new byte[1];
70                               while (fsRead.Read(buffer, 0, buffer.Length) != 0)//返回值为零表示读完
71                               {
72                                    fsWrite.Write(buffer, 0, buffer.Length);
73                               }
74                          }
75                     }
76                     bckgrdwkrReport.ReportProgress(i + 1);//报告进度,触发ProgressChanged事件
77                }
78                prgrsbr1.Value = 0;
79                MessageBox.Show("复制成功");
80                lstbxShowFiles.Items.Clear();
81                txtSavePath.Clear();
82                fileNames = null;
83                savePath = null;
84           }
85
86           private void bckgrdwkrReport_ProgressChanged(object sender, ProgressChangedEventArgs e)
87           {
88                prgrsbr1.Value = e.ProgressPercentage;//e.ProgressPercentage:ReportProgress方法传递的参数
89           }
90      }
91 }

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

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

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

时间: 2024-08-06 08:01:10

【WInform】使用BackgroundWorker控制进度条显示进度的相关文章

异步下载圆形进度条显示进度

圆形进度条参考链接即可:使用css3实现圆形进度条 需求点击下载后遮罩层显示下载进度: 1.圆形进度条参考以上链接,有点小瑕疵,可更改定位距离实现重合. 2.遮罩层: .lbOverlay{ display: none; position: fixed; left: 0; top: 0; zoom: 1; background: black; z-index: 99999; width:100%; height:100%; filter:alpha(opacity=70); /*IE滤镜,透明度

【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示

尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd卡上的全部图片读取,并显示出来.读取的过程有进度条显示. 制作步骤例如以下: 1.首先,res\values\strings.xml对字符设置例如以下,没有什么特别的. <? xml version="1.0" encoding="utf-8"?> <

Ajax上传文件进度条显示

要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显示,就可以 实现上传的进度条效果 前端页面 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ajax上传文件进度条显示

【Android】读取sdcard卡上的所有图片并且显示,读取的过程有进度条显示

虽然下面的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,但是基本思想是这样的. 如下图,在sdcard卡上有4张图片, 打开app,则会吧sd卡上的所有图片读取,并显示出来,读取的过程有进度条显示. 制作过程如下: 1.首先,res\values\strings.xml对字符设置如下,没有什么特别的. <?xml version="1.0" encoding="utf-8"?> <resour

Struts2 文件上传 进度条显示

参考成功博客:http://blog.sina.com.cn/s/blog_bca9d7e80101bkko.html 待测试博客:http://blog.csdn.net/z69183787/article/details/52536255 Struts2 文件上传 进度条显示

Delphi下载指定网址(URL)的文件,带进度条显示

Delphi下载指定网址(URL)的文件,带进度条显示 发布于: 2012-12-26 11:21:04   |  发布在: Delphi文章   |  点击:626 主要使用的是Delphi自带的TIdhttp控件.一.界面设置在窗体上放置两个TEdit控件,一个用于输入要下载的文件URL,一个用于输入要保存到本地的文件路径:放置两个TLabel控件,一个显示文件总大小,一个显示当前已下载大小:放置一个按钮TButton,一个TIdhttp控件(在Indy Clients面板)和一个TIdAn

Extjs 使用fileupload插件上传文件 带进度条显示

一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提交的同时执行实际的文件上传. 因为没有安全的跨浏览器以编程的方式对file表单项设值的方式, 所以标准表单项的 setValue 方法是无效的. getvalue方法的返回值取决于使用何种浏览器; 一些仅仅返回文件名, 一些返回一个完整的文件路径, 一些则返回文件的虚拟路径. 二.在我看来这个插件就

Android——音乐播放器完善——进度条显示当前播放进度,加可拖动进度条(未待解决完问题)

效果: 问题:可拖动进度条随进度条移动时,会致使音乐卡顿(待解决) xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:l

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理

china_xuhua 原文地址 1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线 程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息).下面我就简单结合一个我写的例子给大家做一个介绍. 第一步:设计界面,注意需要引用 using System.Threading; 控件名称分别为: progressBar1:label1:textBox1:button1: 第二