当前位置: 首页 > news >正文

C# Progress

  • 基本使用步骤
    • 示例代码
    • 关键点说明

C# 中, Progress<T> 是一个用于报告操作进度的类,它实现了 IProgress<T> 接口,通常用于异步操作中向 UI 线程或其他上下文报告进度更新。

基本使用步骤

  • 创建 Progress 实例:实例化 Progress<T> 时,需要提供一个回调方法,该方法会在进度更新时被调用。
  • 报告进度:在异步操作中,通过调用 IProgress<T>.Report(T value) 方法来报告当前进度。
  • 处理进度更新:回调方法会在创建 Progress<T> 实例的上下文(通常是 UI 线程)中执行,因此可以安全地更新 UI

示例代码

下面是一个简单的示例,展示如何使用 Progress 报告任务进度:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;// 假设这是一个Windows Forms应用程序
public partial class MainForm : Form
{public MainForm(){InitializeComponent();}private async void StartButton_Click(object sender, EventArgs e){// 创建Progress实例,指定进度更新时的回调方法IProgress<int> progress = new Progress<int>(UpdateProgress);// 启动异步任务,并传递progress对象await DoWorkAsync(progress);MessageBox.Show("任务完成!");}// 进度更新的回调方法private void UpdateProgress(int percentage){// 这里可以安全地更新UI,因为Progress会在UI线程执行此方法progressBar1.Value = percentage;statusLabel.Text = $"进度:{percentage}%";}// 模拟一个耗时的异步操作private async Task DoWorkAsync(IProgress<int> progress){for (int i = 0; i <= 100; i++){// 模拟工作await Task.Delay(50);// 报告当前进度progress?.Report(i);}}
}

关键点说明

  • 线程安全Progress<T> 会捕获创建时的同步上下文(SynchronizationContext),并在该上下文中执行回调方法。这意味着在 UI 应用程序中,回调方法会自动在 UI 线程上执行,避免了跨线程访问 UI 控件的问题。
  • 泛型类型 TT 可以是任何类型,不仅限于整数。例如,你可以定义一个自定义类来传递更详细的进度信息:
public class ProgressInfo
{public int Percentage { get; set; }public string Message { get; set; }
}// 使用自定义类型
IProgress<ProgressInfo> progress = new Progress<ProgressInfo>(info =>
{progressBar1.Value = info.Percentage;statusLabel.Text = info.Message;
});// 报告进度
progress.Report(new ProgressInfo { Percentage = 50, Message = "正在处理..." });
  • null 检查:在调用 Report 方法时,建议先检查 progress 是否为 null,以避免在未提供进度报告器时出现异常。
  • 与异步方法配合Progress<T> 通常与 async/await 一起使用,用于在长时间运行的异步操作中提供反馈。

通过使用 Progress<T>,你可以很方便地在 C# 应用程序中实现进度报告功能,提升用户体验。

http://www.dtcms.com/a/390311.html

相关文章:

  • 【LeetCode 每日一题】3495. 使数组元素都变为零的最少操作次数
  • Part01、02 基础知识与编程环境、C++ 程序设计
  • C++聊天系统从零到一:brpc RPC框架篇
  • Java编程思想 Thinking in Java 学习笔记——第2章 一切都是对象
  • AssemblyScript 入门教程(2)AssemblyScript的技术解析与实践指南
  • 深入理解Java数据结构
  • 【试题】网络安全管理员考试题库
  • 第一章 信息化发展
  • 第六章:实用调试技巧
  • 人工智能通识与实践 - 智能语音技术
  • CSP-S 提高组初赛复习大纲
  • 卷积神经网络CNN-part7-批量规范化BatchNorm
  • [xboard]02 uboot下载、移植、编译概述
  • Python入门教程之字符串运算
  • 堡垒机部署
  • 刷题记录(10)stack和queue的简单应用
  • 如何进行时间管理?
  • Spring面试题及详细答案 125道(46-65) -- 事务管理
  • OA ⇄ CRM 单点登录(SSO)实现说明
  • 人工智能在设备管理软件中的应用
  • __pycache__ 文件夹作用
  • 利欧泵业数据中心液冷系统解决方案亮相2025 ODCC开放数据中心峰会
  • 【论文阅读】Masked Conditional Variational Autoencoders for Chromosome Straightening
  • 天气预测:AI 如何为我们 “算” 出未来的天空?
  • 大数据管理与应用有什么注意事项?企业该如何发挥大数据的价值
  • CSS的opacity 属性
  • STM32 LwIP协议栈优化:从TCP延迟10ms降至1ms的内存配置手册
  • 【0基础3ds Max】创建标准基本体(长方体、球体、圆柱体等)理论
  • 驾驭未来:深度体验 Flet 0.7.0 的重大变革与服务化架构
  • 【Datawhale组队学习202509】AI硬件与机器人大模型 task01 具身智能基础