Winfom 使用 BackgroundWorker 实现进度条

2024-03-01 17:32

本文主要是介绍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 = 0;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=0;i< maxValue;i++){if(form.IsCancle){backgroundWorker1.CancelAsync();}if(backgroundWorker1.CancellationPending){e.Cancel = true;return;}else{form.ChangeProcessValue(i);Thread.Sleep(100);}}}private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){if (e.Error != null){MessageBox.Show(e.Error.ToString());return;}if (!e.Cancelled)MessageBox.Show("处理完毕!");elseMessageBox.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 = 0;}//取消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 + 1;  //获取异步任务的进度百分比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 实现进度条的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/763244

相关文章

Java实现MD5加密的四种方式

《Java实现MD5加密的四种方式》MD5是一种广泛使用的哈希算法,其输出结果是一个128位的二进制数,通常以32位十六进制数的形式表示,MD5的底层实现涉及多个复杂的步骤和算法,本文给大家介绍了Ja... 目录MD5介绍Java 中实现 MD5 加密方式方法一:使用 MessageDigest方法二:使用

mysql删除无用用户的方法实现

《mysql删除无用用户的方法实现》本文主要介绍了mysql删除无用用户的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 1、删除不用的账户(1) 查看当前已存在账户mysql> select user,host,pa

Nginx配置location+rewrite实现隐性域名配置

《Nginx配置location+rewrite实现隐性域名配置》本文主要介绍了Nginx配置location+rewrite实现隐性域名配置,包括基于根目录、条件和反向代理+rewrite配置的隐性... 目录1、配置基于根目录的隐性域名(就是nginx反向代理)2、配置基于条件的隐性域名2.1、基于条件

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

Mybatis从3.4.0版本到3.5.7版本的迭代方法实现

《Mybatis从3.4.0版本到3.5.7版本的迭代方法实现》本文主要介绍了Mybatis从3.4.0版本到3.5.7版本的迭代方法实现,包括主要的功能增强、不兼容的更改和修复的错误,具有一定的参考... 目录一、3.4.01、主要的功能增强2、selectCursor example3、不兼容的更改二、

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超