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对象有三个主要的事件 ...
随机推荐
- 【转】在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)
原文:http://www.cyqdata.com/cnblogs/article-detail-35876# 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件 ...
- VLC for CentOS7
https://blog.csdn.net/qiuyoujie/article/details/78486947 http://elearning.wsldp.com/pcmagazine/insta ...
- 解决warning: #181-D: argument is incompatible with corresponding format string conversion警告
uint8_t NetRSSI=0;uint8_t NetBer=0;uint8_t failtime=0; sscanf(&USART_RX_BUF[0],"%*s%u,%u&qu ...
- Shell常用命令之sort
sort命令 sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出.sort命令既可以从特定的文件,也可以从stdin中获取输入. 语法 sort (选项) (参数) 选项 - ...
- Django部署--uwsgi配置--nginx服务器配置
uwsgi.ini文件 [uwsgi] #使用nginx连接时使用,Django程序所在服务器地址 socket=127.0.0.1:8000 #直接做web服务器使用,Django程序所在服务器地址 ...
- python学习Day03
[主要内容] 1. 编码 1. 最早的计算机编码是ASCII. 美国人创建的. 包含了英文字母(大写字母, 小写字母). 数字, 标点等特殊字符!@#$% 128个码位 2**7 在此基础上加了一位 ...
- python中更人性化的一个单元测试框架:nose2
如果你学过 python 进行自动化测试,你一定使用过 unittest.今天我们要讲的 nose2 是一个高级版本的 unittest.他比 unittest 更容易理解,用起来也更加方便一些. 快 ...
- 死磕java(7)
http://www.cnblogs.com/liunanjava/p/4296045.html 自己写的例子 package com.sougn.trynew; public abstract cl ...
- tmobst6
1.(单选题)Oracle数据库中,在SQL语句中连接字符串的方法是:(). A)CAT B)CONCAT C)JOIN D)UNION 2.(单选题)在数据库中,有一个名为seq的序列对象,以下语句 ...
- tmobst2an
(单选题)与下面代码效果相同的HQL 语句是( ). Criteria criteria = session.createCriteria(User.class); criteria.add(Rest ...