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

推荐订阅源

S
Secure Thoughts
Spread Privacy
Spread Privacy
S
Securelist
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Project Zero
Project Zero
G
GRAHAM CLULEY
Stack Overflow Blog
Stack Overflow Blog
爱范儿
爱范儿
Scott Helme
Scott Helme
S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
The Exploit Database - CXSecurity.com
The Hacker News
The Hacker News
雷峰网
雷峰网
N
News and Events Feed by Topic
宝玉的分享
宝玉的分享
O
OpenAI News
小众软件
小众软件
C
Cybersecurity and Infrastructure Security Agency CISA
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Visual Studio Blog
I
Intezer
Martin Fowler
Martin Fowler
S
Security @ Cisco Blogs
A
Arctic Wolf
Engineering at Meta
Engineering at Meta
U
Unit 42
L
Lohrmann on Cybersecurity
Google Online Security Blog
Google Online Security Blog
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
Schneier on Security
Schneier on Security
V2EX - 技术
V2EX - 技术
IT之家
IT之家
The Register - Security
The Register - Security
T
Tailwind CSS Blog
GbyAI
GbyAI
量子位
人人都是产品经理
人人都是产品经理
Recorded Future
Recorded Future
W
WeLiveSecurity
AWS News Blog
AWS News Blog
B
Blog RSS Feed
腾讯CDC
Hacker News - Newest:
Hacker News - Newest: "LLM"
Microsoft Security Blog
Microsoft Security Blog

博客园 - 老码识途呀

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

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