Winfom 使用 BackgroundWorker 实现进度条
BackgroundWorker 简介(来自百度)
BackgroundWorker是·net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。
场景:界面加载数据量略大或者执行一个比较耗时的操作,如果在该操作未完成之前操作界面,会出现停止响应的情况,这个时候界面就会出现假死状态,当我们用到 BackgroundWorker 时可以良好的提示用户加载进度。
属性
1.WorkerReportsProgress:辅助线程是否报告进度。
2.WorkerSupportsCancellation:辅助线程是否支持取消。
3.CancellationPending:获取一个值,指示应用程序是否已请求取消后台操作。
4.IsBusy:获取一个值,指示 BackgroundWorker 是否正在运行一步操作。
5.WorkerReportsProgress:获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。
方法
1.RunWorkerAsync():开始执行后台操作。(调用该方法后,将触发 BackgroundWorker.DoWork 事件,并以异步的方式执行 DoWork 事件中的代码)
2.ReportProgress(): 引发 BackgroundWorker.ProgressChanged 事件。(调用该方法后,将触发BackgroundWorker. ProgressChanged事件。另外,该方法包含了一个int类型的参数percentProgress,用来表示当前异步操作所执行的进度百分比)
3.CancelAsync():请求取消挂起的后台操作。(调用该方法将使 BackgroundWorker.CancellationPending 属性设置为True)
事件
1.DoWork:操作开始时在另一个线程上运行的事件处理程序。(用于承载异步操作,当调用 BackgroundWorker.RunWorkerAsync() 时触发)
2.ProgressChanged:当辅助线程指示某些操作已经进行时引发。(当调用 BackgroundWorker.ReportProgress(int percentProgress) 方式时触发该事件)
3.RunWorkerCompleted:当辅助线程完成(无论成功、失败还是取消)时引发。
代码案例
Form1窗体设计:

Form1代码:
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms; namespace BackgroundWorkerDemo
{
public partial class Form1 : Form
{
ProgressForm form; int maxValue = ; public Form1()
{
InitializeComponent();
InitializeBackgroundWorker();
} private void InitializeBackgroundWorker()
{
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
} private void button1_Click(object sender, EventArgs e)
{
maxValue = Convert.ToInt32(textBox1.Text);
form = new ProgressForm(); //显示进度条窗体
form.MaxProcessBarValue = maxValue; this.backgroundWorker1.RunWorkerAsync(); //运行backgroundWorker组件 form.ShowDialog(this);
} private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for(int i=;i< maxValue;i++)
{
if(form.IsCancle)
{
backgroundWorker1.CancelAsync();
} if(backgroundWorker1.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
form.ChangeProcessValue(i);
Thread.Sleep();
}
}
} private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
return;
}
if (!e.Cancelled)
MessageBox.Show("处理完毕!");
else
MessageBox.Show("处理终止!");
form.Close();
}
}
}
ProgressForm窗体设计:

ProgressForm代码:
using System;
using System.Windows.Forms; namespace BackgroundWorkerDemo
{
public partial class ProgressForm : Form
{
/// <summary>
/// 进度条的最大值
/// </summary>
public int MaxProcessBarValue { get; set; } public bool IsCancle { get; set; } = false;
public ProgressForm()
{
InitializeComponent(); this.Load += Form2_Load;
} private void Form2_Load(object sender, EventArgs e)
{
this.progressBar1.Maximum = this.MaxProcessBarValue;
this.progressBar1.Minimum = ;
} //取消
private void btnCancel_Click(object sender, EventArgs e)
{
try
{
this.btnCancel.Enabled = false;
IsCancle = true;
this.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString(), ex);
}
}
internal void ChangeProcessValue(int v)
{
try
{
this.Invoke(new Action(() =>
{
this.progressBar1.Value = v + ; //获取异步任务的进度百分比
label1.Text = $"完成比:{ v + 1} / {this.MaxProcessBarValue} {Math.Round((v+1)*1.0/this.MaxProcessBarValue * 100,2)}%";
}));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString(), ex);
}
}
}
}
结果:

源码:
链接: https://pan.baidu.com/s/1Ba5iWWFRKV6wjcHl39qpIQ
提取码: sj7e
Winfom 使用 BackgroundWorker 实现进度条的更多相关文章
- 【Winform】使用BackgroundWorker控制进度条显示进度
许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...
- BackgroundWorker 组件 -- 进度条
代码: BackgroundWorker bw = new BackgroundWorker(); public MainWindow() { InitializeComponent(); bw.Wo ...
- BackgroundWorker+ProgressBar+委托 实现多线程、进度条
上文在<C# 使用BackgroundWorker实现WinForm异步>介绍了如何通过BackgroundWorker实现winForm异步通信,下面介绍如何通过BackgroundWo ...
- C#调用耗时函数时显示进度条浅探
最近在做一个VSS日志分析工具,使用C#进行开发,在完成了所有功能后,发现,从服务器下载VSS日志非常耗时,因为此,导致工具使用体验不好,所以,准备增加一个进度条.鉴于C#不经常使用,一下子搞个进度条 ...
- WinForm中使用BackgroundWorker异步加载数据并使用进度条
在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的.因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应:其次可 ...
- c# 异步进度条组件BackgroundWorker
//控件事件调用DoWork()方法就行. #region 进度条 private BackgroundWorker worker = null; private void DoWork(string ...
- C#.NET中使用BackgroundWorker在模态对话框中显示进度条
这里是一个示例,其中展示了如何使用Backgroundworker对象在模态对话框中显示后台操作的实时进度条. 首先是主窗体代码: using System; using System.Collect ...
- 批量处理任务进度条控制—基于BackgroundWorker
今天要做一个批量处理图层数据的功能,希望在处理任务过程中,各个任务都能在进度条中显示自己的当前进度,决定继续使用强大易用的BackgroundWorker组件.通过在RunWorkerComplete ...
- 进度条--ProgressBar和BackgroundWorker
1) 需求:就餐打卡数据处理后,插入数据库中,用进度条显示过程 2) 思路:总进度为txt文本文件的行数(数据都是按照行写入),文本文件的大小 //BackgroundWorker对象有三个主要的事件 ...
随机推荐
- Azure 认知服务概述
背景知识 近些年随着机器学习.深度学习等技术的不断发展,人工智能在越来越多的场景得到了应用,如人脸识别.图像识别.语音识别.语音生成.自然语言处理.决策分析等等,让机器拥有了听.说.看和思考的能力,很 ...
- LeetCode 18: 4 Sum 寻找4数和
链接 4Sum 难度 Medium 描述 Given an array nums of n integers and an integer target, are there elements a , ...
- YUM安装软件提示[Errno 14] curl#6 - "Could not resolve host: mirrors.cloud.aliyuncs.com; 未知的错误"
报错如下: 翻译过来就是 所以问题很简单: 第一种情况:本地DNS服务错误 第二种情况:远程主机挂了 第三种情况:远程主机地址配置错误 第一种解决方法:换DNS 首先验证一下是不是本地DNS错误 从上 ...
- Codeforces 1197E Count The Rectangles(树状数组+扫描线)
题意: 给你n条平行于坐标轴的线,问你能组成多少个矩形,坐标绝对值均小于5000 保证线之间不会重合或者退化 思路: 从下到上扫描每一条纵坐标为y的水平的线,然后扫描所有竖直的线并标记与它相交的线,保 ...
- 基于LNMP架构部署NextCloud私有云盘
一.NextCloud 概述 云盘这个词无论是做技术出身的朋友还是普通的网民.想必已经听的非常多了.在日常生活当中我们用的最多的云盘莫过于百度网盘了 在前几年百花齐放的网盘市场.到现如今只剩下了百度网 ...
- Redis5.xc两种持久化方式以及主从复制配置
关注公众号:CoderBuff,回复"redis"获取<Redis5.x入门教程>完整版PDF. <Redis5.x入门教程>目录 第一章 · 准备工作 第 ...
- Hapi+MySql项目实战配置插件-加载文件渲染母版(三)
加载插件 一般在其它node框架下,我们安装好插件直接require('插件')就能正常使用了,但是在Hapi下我们必须要Server.register()方法,才能正常使用插件.举个例子: serv ...
- 1 Nginx + 12 Tomcat +2DB 实现2个程序负载均衡
根据真实生产环境 总结. 硬件:共计5台服务器 1台负载windows.2台业务windows.2台数据库linux 业务:运行两个程序,两个数据库 具体:63服务器安装 Nginx 做负载 :61 ...
- centos7.5下一键安装nginx-1.8.1
#!/usr/bin/bash #安装依赖软件 yum install -y make cmake gcc gcc-c++ autoconf automake libpng-devel libjpeg ...
- rysnc知识梳理
rsync语法: Local: rsync [OPTION...] SRC... [DEST] #<===本地传输数据 Access via remote shell: #<===借助通道 ...