首页 > 其他分享 >winform 进度报告

winform 进度报告

时间:2023-10-06 23:44:06浏览次数:26  
标签:报告 ReportProgress UI 线程 进度 Progress winform

在创建进度条时候,需要有订阅进度变化的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报告进度
                }); 

 

标签:报告,ReportProgress,UI,线程,进度,Progress,winform
From: https://www.cnblogs.com/alicia0/p/17745314.html

相关文章

  • 《CF gym Reverse LIS》解题报告
    原题链接一开始看到这题就很像模拟费用流,不过立马就放弃了,然后之后就再也没想过这个思路了。。。正解是模拟费用流,先讲一下答案长什么样,把\(0\)的权值记为\(1\),\(1\)的权值记为\(-1\),那么我们答案就是要选一段前缀和\(k\)段不相交的区间的最大值加上\(1\)的个数。......
  • 《CF1824E LuoTianyi and Cartridge》 解题报告
    好题。模拟赛出了这题,抽象。初步化简:由于\(\min(A,C)\)不好处理,我们考虑从大到小加边加点,或者从小到大删边删点。一般题目是考虑加边加点好操作一点,这题是考虑删边删点好操作。然后我们记当前枚举的\(\min(A,C)\)的最小值是多少,记为\(x\)。然后称大于等于\(x\)点权......
  • 论文、开题报告中工作安排图、日程进度图绘制:Visio
      本文介绍基于Visio软件绘制时间轴、日程安排图、时间进度图等的方法。  在很多学习、工作场合中,我们往往需要绘制如下所示的一些带有具体时间进度的日程安排、工作流程、项目进展等可视化图表。  而基于Visio软件,我们就可以非常轻松地绘制出这样的图案。本文就详细介绍......
  • axios_axios的进度显示
    在axios的配置中加入progressEvent//1.获取基本数据(随笔数据,文章数据,评论数据,阅读量)exportconstreqGetArticleBasicData=()=>instance.get('/ajax/blogStats',{onDownloadProgress:function(progressEvent){//axios封装的原生获取下载进度的事件,该回调......
  • 日程报告57
    代码时间(包括上课):5h代码量(行):博客数(篇):1 跟教程补完了剩下的界面设计,but在数据库这一块卡住了,vs和sqlsever死活连不上就很烦Orz还不如补一补python什么的好歹收获还大点……......
  • P3477 [POI2008] PER-Permutation 解题报告
    我咕咕咕了这道题半年之久?好像洛谷好多题解都被hack了啊,但是没有被撤。(本题解现有hack均通过)题目链接折叠题干[POI2008]PER-Permutation题目描述Multisetisamathematicalobjectsimilartoaset,buteachmemberofamultisetmayhavemorethanonemem......
  • Go每日一库之164:uiprogress(终端进度条)
    今天给大家推荐的是在终端(terminal)下能够显示进度条的工具:uiprogress。先看下使用该包的效果图:相信大家在linux或mac终端上都下载过东西,然后会出现下载的进度条。今天我们就给大家分析下实现原理并演示其效果。安装$goget-vgithub.com/gosuri/uiprogress实现原理分析实......
  • 《AT_abc322_g Two Kinds of Base》解题报告
    好题,考场上想到做法了,没写出来,被薄纱了,记录一下。主要是做的比较顺一下就想到了。我们先转换一下\(f\)函数\(f(S,a,b)=\sum\limits_{i=1}^kS_i\times(a^{k-i}-b^{k-i})\)我们可以发现对于位数\(>2\)的,一定满足\(a\le\frac{(x+1)}2\),因为如果不是的话\(a^2-(a-1)^2=......
  • 解题报告 洛谷P2155 [SDOI2008] 沙拉公主的困惑
    P2155[SDOI2008]沙拉公主的困惑题目题面非常的简洁,求\(\sum\limits_{i=1}^{n!}[i\perpm!]\)直接颓式子,\[\begin{aligned}ans&=\dfrac{n!}{m!}\cdot\varphi(m!)\\\\&=\dfrac{n!}{m!}*m!\prod\limits_{p\midm!}[\dfrac{p-1}{p}]\\&=n!\cdot\dfrac{\......
  • 解题报告 P2680 [NOIP2015 提高组] 运输计划
    P2680[NOIP2015提高组]运输计划题目链接LCA的题,需要求最大值最小,考虑二分答案。先存储每组询问的距离。然后二分答案时找出所有比当前答案长的距离的重叠部分。在这些重叠部分中找出权值最大的边。判断最长链减去这条边是否小于等于当前答案。否则返回0代码如下/**@......