惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Webroot Blog
Webroot Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News | PayPal Newsroom
S
Security Affairs
T
Tor Project blog
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Help Net Security
Help Net Security
U
Unit 42
云风的 BLOG
云风的 BLOG
The Hacker News
The Hacker News
Cisco Talos Blog
Cisco Talos Blog
量子位
F
Full Disclosure
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
有赞技术团队
有赞技术团队
T
Troy Hunt's Blog
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
人人都是产品经理
人人都是产品经理
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
腾讯CDC
AI
AI
Last Week in AI
Last Week in AI
Latest news
Latest news
Google Online Security Blog
Google Online Security Blog
N
Netflix TechBlog - Medium
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
Martin Fowler
Martin Fowler
Blog — PlanetScale
Blog — PlanetScale
V2EX - 技术
V2EX - 技术
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 老码识途呀

基于.NET的Windows窗体编程之WinForms图像控件 基于.NET的Windows窗体编程之WinForms提示控件 基于.NET的Windows窗体编程之WinForms时间控件 基于.NET的Windows窗体编程之WinForms图表控件 基于.NET的Windows窗体编程之WinForms输入与显示 基于.NET的Windows窗体编程之WinForms菜单工具栏 基于.NET的Windows窗体编程之WinForms打印 基于.NET的Windows窗体编程之WinForms对话框 基于.NET的Windows窗体编程之WinForms列表控件 基于.NET的Windows窗体编程之WinForms数据表格 基于.NET的Windows窗体编程之WinForms事件简介 基于.NET的Windows窗体编程之WinForms布局简介 基于.NET的Windows窗体编程之WinForms控件简介 基于.NET的Windows窗体编程之WinForms入门简介 推荐一款基于.NET和百度飞桨的OCR识别组件 新书速递,手把手教你WPF入门与开发 推荐一种并发线程中资源同步常用方法 推荐一种手动设置异步线程等待机制的解决方案 推荐一款基于.NET的进程间数据交互经典解决方案 推荐一款线程or进程间数据同步解决方案 推荐一款代码规范检查(CodeReview)神器 推荐一款高性能状态机管理解决方案 推荐一款进程间高速交换数据的解决方案 推荐一款基于.NET的进程间通信框架 推荐一款基于EF-Core的分库分表利器 推荐一种程序崩溃闪退或卡死的分析方法 推荐一款Excel读写神器之MiniExcel入门详解 推荐一款Ioc容器之Ninject入门详解 ASP.NET Core WebApi+React UI开发入门详解
推荐一种异步线程执行过程中更新进度的方法
老码识途呀 · 2025-11-10 · via 博客园 - 老码识途呀

在实际应用中,对于耗时较长或者耗费性能的操作,为了避免UI卡顿,通常采用后台异步线程的方式进行处理,但用户需要知道当前操作的执行进度(如当前进度百分比),以及一些更详细的过程信息(如共分5步,当前是正在执行第几步)等内容。实现此功能有很多种方法,今天介绍一种通过.NET自带的IProgress接口实现进度上报的操作方法,谨供学习分享使用,如有不足之处,还请指正。

image

IProgress概述

IProgress接口是微软在.NET Framework4.5及之后的版本中提供的一种用于异步方法中进度上报的方法接口及实现。IProgress<T>及它的实现类Progress<T>是泛型实现,它接收基础数据类型或自定义的引用类型。Progress<T>初始化对象时,接收一个Action<T> 的handler,当调用接口的Report(T value)方法时,就会执行Action<T>对应的handler委托方法进行更新进度。

涉及知识点如下:

  1. Report<T value> 用于向外报告一个进度更新。
  2. Progress(Action<T> handler) 实现类的构造函数,参数为更新进度的委托。

示例代码

在本示例中,创建Execute方法,模拟后台耗时较长的任务,并在执行过程中通过IProgress接口的Report方法上报执行进度。如下所示:

private async Task Execute(IProgress<TaskReport> progress)
{
	for (int i = 0; i < 100; i++)
	{
		//do somthing
		await Task.Delay(200);
		progress.Report(new TaskReport()
		{
			Percent=i,
			Msg=$"当前是第{i}个步骤,进行中"
		});
	}
	progress.Report(new TaskReport()
	{
		Percent=100,
		Msg="完成"
	});
}

接着创建IProgress的实例对象,并传入当Report方法调用时,需要执行的委托RefreshUI,用于刷新页面的进度,如下所示:

private async void btnExceute_Click(object sender, EventArgs e)
{
	IProgress<TaskReport> progress = new Progress<TaskReport>(RefreshUI);
	await Execute(progress);
}

其中RefreshUI方法,主要用于为UI页面上的进度条和Label赋值,如下所示:

private void RefreshUI(TaskReport taskReport)
{
	this.pb1.Value = taskReport.Percent;
	this.lblMsg.Text = taskReport.Msg;
}

演示效果

运行实例,点击执行按钮如下所示:

GIF 2025-11-9 21-45-40

以上就是《推荐一种异步线程执行过程中更新进度的方法》的全部内容,旨在抛砖引玉,一起学习,共同进步!