winform 进度报告

发布时间 2023-10-06 23:44:06作者: constantinealicia

在创建进度条时候,需要有订阅进度变化的action ,可以使用net提供的progress解决这一问题

Progress<T>对象是.NET中用于报告进度的通用类型。它允许在多线程环境下方便地传递进度信息并更新UI元素。

Progress<T>是一个泛型类,其中的T表示进度报告的数据类型。通过创建Progress<T>对象,并向其构造函数传递一个用于处理进度报告的委托,可以实现进度的报告和处理。

使用Progress<T>的主要步骤如下:

  1. 创建Progress<T>对象,指定进度报告的数据类型。例如,Progress<int>表示进度以整数类型进行报告。
  2. 通过订阅Progress<T>对象的事件或使用进度报告的回调方法,定义处理进度报告的逻辑。例如,可以在事件处理程序或回调方法中更新UI元素、记录日志等。
  3. 在执行需要报告进度的操作时,使用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方法进行进度报告的步骤如下:

  1. 在需要报告进度的地方,调用ReportProgress方法,并传入当前的进度值作为参数。例如,在某个循环内部的计算过程中,可以根据实际进度情况调用progress.Report(50)来报告进度为50。
  2. Progress<T>对象会自动触发订阅的进度事件或回调方法,将报告的进度信息传递给相应的处理逻辑。

在这段代码中,ReportProgress方法被用于报告进度,并将报告的进度值赋值给名为proBar的进度条的Value属性,以更新UI显示。

需要注意的是,ReportProgress方法会在UI线程上触发进度处理的逻辑。因此,在多线程环境下使用Progress<T>对象进行进度报告时,确保调用ReportProgress方法的线程与UI线程同步,以避免线程安全问题。

                Progress<int> progress = new Progress<int>(ReportProgress =>
                {
                    proBar.Value = ReportProgress; //让进度条数值绑定progress报告进度
                });