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
控件的问题。 - 泛型类型
T
:T
可以是任何类型,不仅限于整数。例如,你可以定义一个自定义类来传递更详细的进度信息:
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#
应用程序中实现进度报告功能,提升用户体验。