在创建进度条时候,需要有订阅进度变化的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
方法被用于报告进度,并将报告的进度值赋值给名为proBar
的进度条的Value
属性,以更新UI显示。
需要注意的是,ReportProgress
方法会在UI线程上触发进度处理的逻辑。因此,在多线程环境下使用Progress<T>
对象进行进度报告时,确保调用ReportProgress
方法的线程与UI线程同步,以避免线程安全问题。
Progress<int> progress = new Progress<int>(ReportProgress => { proBar.Value = ReportProgress; //让进度条数值绑定progress报告进度 });
标签:报告,ReportProgress,UI,线程,进度,Progress,winform From: https://www.cnblogs.com/alicia0/p/17745314.html