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对象有三个主要的事件 ...
随机推荐
- 使用C++进行声明式编程
声明式编程(英语:Declarative programming)是一种编程范型,与命令式编程相对立.它描述目目标性质,让计算机明白目标,而非流程.声明式编程不用告诉电脑问题领域,从而 ...
- composer实践总结
composer composer 概述 FIG 最初由几位知名 PHP 框架开发者发起,在吸纳了许多优秀的大脑和强健的体魄后,提出了 PSR-0 到 PSR-4 五套 PHP 非官方规范: PSR- ...
- 平滑重启更新(GR机制)
平滑重启更新(GR机制) 什么是平滑启动机制 是一种在协议重启时保证转发业务不中断的机制. 什么时候用到平滑重启 平滑重启一般应用于业务更新或者版本发布过程中,能够避免因为代码发布重启服务导致的暂时性 ...
- Intellij IDEA使用(一)项目模板类型
概述 IDEA默认打开后,会出现欢迎页面,可以选择打开Project的方式. 对于新建的Project,一般会选择[Create New Project],对于界面中,众多的Project类型,有时候 ...
- 关于Windows Server 服务器 安装tomcat部署Java Web 项目的问题
我遇到的问题是:不知道怎么配置,感觉在服务器上部署一个web项目,应该是很高大上,步骤应该很繁琐,但是,事实却不是那样.配置反而挺简单. tomcat配置:在tomcat安装目录中的conf文件夹下有 ...
- 使用nginx搭建一个可用的静态资源web服务器
新建dlib目录,dlib里面放着很多index.html文件 修改conf文件 配置location,/所有的请求,这里一般使用alias,这样url后面的路径和dlib/下面的路径是一一对应的,如 ...
- 如何更改Jframe里Jpanel的大小
先贴代码: package xiya; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; ...
- HDU_1175_A*
http://acm.split.hdu.edu.cn/showproblem.php?pid=1043 刚开始一脸蒙逼,看了题解之后,参考了A*算法. 参考:http://www.cnblogs.c ...
- AI产品经理工作流程——需求分析和产品设计
1.AI产品设计常见失败原因 技术驱动产品设计,即我有什么技术就做什么产品.尽管许多公司不惜重金招聘高级AI算法工程师,确实这样也能帮助企业拿到大量的融资,但也容易给公司带来技术决定产品设计的局限.然 ...
- 2019icpc西安邀请赛
来源:https://www.jisuanke.com/contest/2625?view=challenges 更新中 A.Tasks 直接贪心 代码:听说当时很多队伍提前拆题甚至上机了,所以很多0 ...