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

推荐订阅源

Hacker News - Newest:
Hacker News - Newest: "LLM"
S
SegmentFault 最新的问题
The Cloudflare Blog
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
有赞技术团队
有赞技术团队
www.infosecurity-magazine.com
www.infosecurity-magazine.com
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threatpost
The Hacker News
The Hacker News
人人都是产品经理
人人都是产品经理
阮一峰的网络日志
阮一峰的网络日志
大猫的无限游戏
大猫的无限游戏
L
Lohrmann on Cybersecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
博客园 - 叶小钗
量子位
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
S
Secure Thoughts
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Help Net Security
Help Net Security
爱范儿
爱范儿
C
Cybersecurity and Infrastructure Security Agency CISA
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
Check Point Blog
WordPress大学
WordPress大学
Last Week in AI
Last Week in AI
T
Tor Project blog
NISL@THU
NISL@THU
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
The Register - Security
The Register - Security
Recent Announcements
Recent Announcements
N
News and Events Feed by Topic
B
Blog RSS Feed

博客园 - 老码识途呀

基于.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

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