winform 进度报告
在创建进度条时候,需要有订阅进度变化的action ,可以使用net提供的progress解决这一问题
Progress<T>对象是.NET中用于报告进度的通用类型。它允许在多线程环境下方便地传递进度信息并更新UI元素。
Progress<T>是一个泛型类,其中的T表示进度报告的数据类型。通过创建Progress<T>对象,并向其构造函数传递一个用于处理进度报告的委托,可以实现进度的报告和处理。
使用Progress<T>的主要步骤如下:
- 创建
Progress<T>对象,指定进度报告的数据类型。例如,Progress<int>表示进度以整数类型进行报告。 - 通过订阅
Progress<T>对象的事件或使用进度报告的回调方法,定义处理进度报告的逻辑。例如,可以在事件处理程序或回调方法中更新UI元素、记录日志等。 - 在执行需要报告进度的操作时,使用
Progress<T>对象的相关方法报告进度。这将自动在UI线程上触发事件或回调方法,以便进行进度处理。
Progress<T>的特点包括:
- 自动处理线程同步:
Progress<T>内部使用了SynchronizationContext来自动处理进度报告在UI线程上的执行,避免了在多线程环境下的线程安全问题。 - 简化进度报告:通过使用
Progress<T>对象,开发者只需关注实际的进度报告逻辑,而不必手动管理线程同步和UI更新。
需要搭配 Report 方法使用 在代码中使用Progress<T>对象实例的Report方法来报告进度。要注意的是,Report方法的参数类型需要与Progress<T>中指定的泛型类型相匹配。这个方法会将入参的变化报告给订阅者,方便订阅者处理
if (response.Content.Headers.ContentLength > 0)
{
double progressPercentage = (double)((double)totalBytesRead / response.Content.Headers.ContentLength * 100);
progress.Report((int)progressPercentage); //这里将下载进度报告给progress
}
其次是ReportProgress委托方法,用于报告进度。它是Progress<T>对象的成员方法,通过该方法可以向订阅了进度事件或回调的对象传递进度信息。
一般情况下,ReportProgress方法的参数类型与Progress<T>对象中指定的泛型类型相匹配。在这个例子中,泛型类型为int,因此ReportProgress方法接受一个整数类型的参数用于表示进度值。
使用ReportProgress方法进行进度报告的步骤如下:
- 在需要报告进度的地方,调用
ReportProgress方法,并传入当前的进度值作为参数。例如,在某个循环内部的计算过程中,可以根据实际进度情况调用progress.Report(50)来报告进度为50。 Progress<T>对象会自动触发订阅的进度事件或回调方法,将报告的进度信息传递给相应的处理逻辑。
需要注意的是,ReportProgress方法会在UI线程上触发进度处理的逻辑。因此,在多线程环境下使用Progress<T>对象进行进度报告时,确保调用ReportProgress方法的线程与UI线程同步,以避免线程安全问题。
Progress<int> progress = new Progress<int>(ReportProgress => { proBar.Value = ReportProgress; //让进度条数值绑定progress报告进度 });

浙公网安备 33010602011771号