C#【必备技能篇】Winform跨线程更新进度条的实例
文章目录
- 实例一:【方便理解,常用!】
- 源码:
- 运行效果:
- 实例二:【重在理解代码本身】
- 源码:
- 运行效果:
- 参考:
实例一:【方便理解,常用!】
跨线程更新进度条【事件触发(进度条值增加的方法在另一个命名空间下的类中)】
源码:
AddNum.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ProgressBarAddNum
{public class AddNum{public static int Num = 0;public delegate void UpdateProgress(int index);public static event UpdateProgress onUpdateProgress;public static void Add(){UpdateProgressMethod(Num > 100 ? 0 : Num);Num+=2; }public static void UpdateProgressMethod(int i){if (onUpdateProgress != null){onUpdateProgress.BeginInvoke(i, null, null);}}}
}
Form1.cs

using ProgressBarAddNum;
using System;
using System.Threading;
using System.Windows.Forms;namespace WindowsFormsApp1
{public partial class Form1 : Form{public Form1(){InitializeComponent();AddNum.onUpdateProgress += AddNum_onUpdateProgress;//注意:此事件绑定只绑定一次,不能多次绑定}public static Thread thread;private void button1_Click(object sender, EventArgs e){AddNum.Num = 0;thread = new Thread(Process);thread.IsBackground = true;thread.Start();}public delegate void UpdateProgress(int index);private void AddNum_onUpdateProgress(int index){if (progressBar1.InvokeRequired){UpdateProgress dus = new UpdateProgress(AddNum_onUpdateProgress);this.BeginInvoke(dus, new object[] { index });//方法一//this.BeginInvoke(dus, index);//方法二//progressBar1.Invoke(dus, new object[] { index });//方法三:也可以同时更新textBox1的值【???】//progressBar1.Invoke(dus, index);//方法四:也可以同时更新textBox1的值【???】}else{progressBar1.Value = index;textBox1.Text = index.ToString();//注意:同时更新textBox1的值}}private void Process(){while (true){if (AddNum.Num <= 100){AddNum.Add();Thread.Sleep(50);}else{break;}}}private void button2_Click(object sender, EventArgs e){if (thread != null){thread.Abort();thread = null;}progressBar1.Value = 0;textBox1.Text = "0";}}
}
运行效果:

实例二:【重在理解代码本身】
C#中的事件是建立在委托的基础上,标准的事件模型应该包括以下几点:
- 声明一个用于定义事件的委托,这里用系统自带的泛型委托原型EventHandler,如:public delegate void EventHandler(object sender,TEventArgs e);这里面的TEventArgs是由我们自定义的参数类型,继承自EventArgs基类
- 事件参数的名称以EventArgs结束
- 声明事件的委托原型即EventHandler,它的返回值为void
- 声明事件的委托原型即EventHandler,它有两个参数:sender和e,sender表示事件触发者,e表示事件触发时的参数
- 事件的声明是在普通委托声明的前面加上,event关键字,如:public event EventHandler FileUploaded;
源码:
文件下载时,要实时更新进度条,这时更新进度的方法就应该由下载类在下载的同时根据实时的下载进度利用事件去同步更新进度条的值。代码如下:

using System;
using System.Threading;
using System.Windows.Forms;namespace WindowsFormsApp2
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void ShowProcess(object sender, FileUploaderEventArgs e){//定义委托Action t = () =>{progressBar1.Value = e.FileProgress;label1.Text = e.FileProgress.ToString();};//跨线程操作this.BeginInvoke(t);Thread.Sleep(100);//【注意】:触发事件后的方法要执行完毕,才会退出while中的触发事件代码}private void button1_Click_1(object sender, EventArgs e){FileUploader f1 = new FileUploader();f1.FileUploaded += ShowProcess; //绑定事件ThreadPool.QueueUserWorkItem((a) => f1.Upload());//加入线程池}}/// <summary>/// 文件下载类/// </summary>class FileUploader{public event EventHandler<FileUploaderEventArgs> FileUploaded;//定义事件public void Upload(){var e = new FileUploaderEventArgs() { FileProgress = 0 };while (e.FileProgress < 100){//DoSomething();//执行一些下载任务e.FileProgress++;FileUploaded(this, e);//触发事件//Thread.Sleep(100);//【注意】:或者注释掉上边的代码,使用这个,实际中更常用}}}/// <summary>/// 自定义参数/// </summary>class FileUploaderEventArgs : EventArgs{public int FileProgress { get; set; }}
}
运行效果:

参考:
https://www.cnblogs.com/maitian-lf/p/3654146.html
相关文章:
C#【必备技能篇】Winform跨线程更新进度条的实例
文章目录实例一:【方便理解,常用!】源码:运行效果:实例二:【重在理解代码本身】源码:运行效果:参考:实例一:【方便理解,常用!】 跨线…...
(1分钟速通面试) 矩阵分解相关内容
矩阵分解算法--总结QR分解 LU分解本篇博客总结一下QR分解和LU分解,这些都是矩阵加速的操作,在slam里面还算是比较常用的内容,这个地方在isam的部分出现过。(当然isam也是一个坑,想要出点创新成果的话 可能是不太现实的 短期来讲 哈…...
this指向
(1)在全局环境中的this——window 无论是否在严格模式下,在全局执行环境中(在任何函数体外部)this 都指向全局对象。 "use strict"console.log(this); //windowconsole.log(thiswindow);//true (…...
安卓小游戏:小板弹球
安卓小游戏:小板弹球 前言 这个是通过自定义View实现小游戏的第三篇,是小时候玩的那种五块钱的游戏机上的,和俄罗斯方块很像,小时候觉得很有意思,就模仿了一下。 需求 这里的逻辑就是板能把球弹起来,球…...
7、单行函数
文章目录1 函数的理解1.1 什么是函数1.2 不同DBMS函数的差异1.3 MySQL的内置函数及分类2 数值函数2.1 基本函数2.2 角度与弧度互换函数2.3 三角函数2.4 指数与对数2.5 进制间的转换3 字符串函数4 日期和时间函数4.1 获取日期、时间4.2 日期与时间戳的转换4.3 获取月份、星期、星…...
华为机试题:HJ56 完全数计算(python)
文章目录博主精品专栏导航知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() :打印输出。3、整型int() :将指定进制…...
opencv——傅里叶变换、低通与高通滤波及直方图等操作
1、傅里叶变换a、傅里叶变换原理时域分析:以时间为参照进行分析。频域分析:相当于上帝视角一样,看事物层次更高,时域的运动在频域来看就是静止的。eg:投球——时域分析:第1分钟投了3分,第2分钟投…...
【NGINX入门指北】 进阶篇
nginx 进阶篇 文章目录nginx 进阶篇一、Nginx Proxy 服务器1、代理原理2、proxy代理3、proxy缓存一、Nginx Proxy 服务器 1、代理原理 正向代理 内网客户机通过代理访问互联网,通常要设置代理服务器地址和端口。 反向代理 外网用户通过代理访问内网服务器&…...
Python中关于@修饰符、yeild关键词、next()函数的基本功能简述
关于修饰符:其实就是将修饰符下面的函数当成参数传给它上面的函数。 def a(x):print(a)adef b():print(b) 其效果等价为: def a(x):print(a)def b():print(b)a(b())有个记忆诀窍,的下面哪个函数最近,谁就是儿子,谁就…...
结合Coverity扫描Spring Boot项目进行Path Manipulation漏洞修复
本篇介绍使用Coverity 扫描基于Spring Boot 项目中的Path Manipulation 漏洞, 进而解决风险,并且可以通过扫描。 什么样的代码会被扫描有路径操纵风险? 在Spring Boot 项目中, 实验了如下的场景: 1. Control 中 file path 作为参数传递的会被扫描,单纯服务方法不会 场…...
【FFMPEG源码分析】从ffplay源码摸清ffmpeg框架(一)
ffplay入口 ffmpeg\fftools\ffplay.c int main(int argc, char **argv) {/*******************start 动态库加载/网络初始化等**************/int flags;VideoState *is;init_dynload();av_log_set_flags(AV_LOG_SKIP_REPEATED);parse_loglevel(argc, argv, options);/* regis…...
C++蓝桥杯 基础练习,高精度加法,输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
C蓝桥杯 基础练习,高精度加法 问题描述 输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。 定义一…...
MySQL面试题:SQL语句的基本语法
MySQL目录一、数据库入门1. 数据管理技术的三个阶段2. 关系型数据库与非关系型数据库3. 四大非关系型数据库a. 基于列的数据库(column-oriented)b. 键值对存储(Key-Value Stores)c. 文档存储(Document Storesÿ…...
Fluid-数据编排能力原理解析
前言本文对Fluid基础功能-数据编排能力进行原理解析。其中涉及到Fluid架构和k8s csi driver相关知识。建议先了解相关概念,为了便于理解,本文使用JuiceFS作为后端runtime引擎。原理概述Fuild数据编排能力,主要是在云原生环境中,能…...
并发线程、锁、ThreadLocal
并发编程并发编程Java内存模型(JMM)并发编程核心问题—可见性、原子性、有序性volatile关键字原子性原子类CAS(Compare-And-Swap 比较并交换)ABA问题Java中的锁乐观锁和悲观锁可重入锁读写锁分段锁自旋锁共享锁/独占锁公平锁/非公平锁偏向锁/轻量级锁/重…...
CMMI-结项管理
结项管理(ProjectClosing Management, PCM)是指在项目开发工作结束后,对项目的有形资产和无形资产进行清算;对项目进行综合评估;总结经验教训等。结项管理过程域是SPP模型的重要组成部分。本规范阐述了结项管理的规程&…...
网络通信协议是什么?
网络通信基本模式 常见的通信模式有如下2种形式:Client-Server(CS) 、 Browser/Server(BS) 实现网络编程关键的三要素 IP地址:设备在网络中的地址,是唯一的标识。 端口:应用程序在设备中唯一的标识。 协议: 数据在网络中传输的…...
阶段5:Java分布式与微服务实战
目录 第33-34周 Spring Cloud电商实战 一、Eureka-server模块开发 1、引入依赖 2、配置文件 3、启动注解 一、Eureka-server模块开发 第33-34周 Spring Cloud电商实战 一、Eureka-server模块开发 1、引入依赖 父项目依赖:cloud-mall-practice springboot的…...
我的创作纪念日
目录 机缘 收获 日常 憧憬 机缘 其实本来从大一上学期后半段(2017)就开始谢谢零星的博客,只不过当时是自己用hexo搭建了一个小网站,还整了个域名:jiayoudangdang.top,虽然这个早就过期; 后来发现了CSDNÿ…...
Qml学习——动态加载控件
最近在学习Qml,但对Qml的各种用法都不太熟悉,总是会搞忘,所以写几篇文章对学习过程中的遇到的东西做一个记录。 学习参考视频:https://www.bilibili.com/video/BV1Ay4y1W7xd?p1&vd_source0b527ff208c63f0b1150450fd7023fd8 目…...
37 Python 时序和文本:词袋模型 BoW 和 TF-IDF 到底怎么理解?
Python 文本分析入门:词袋模型 BoW 和 TF-IDF 到底怎么理解? 上一篇主要解决了两个基础问题: 为什么中文文本通常要先分词?为什么分词之后还要做停用词过滤? 但文本清洗完成之后,新的问题很快就会出现&…...
手把手教你用NOAA气象数据做可视化分析(含常见字段解析与避坑指南)
手把手教你用NOAA气象数据做可视化分析(含常见字段解析与避坑指南) 气象数据可视化是理解气候模式、分析极端天气事件的重要工具。美国国家海洋和大气管理局(NOAA)提供的全球历史气候网络日数据(GHCN-Daily࿰…...
利用快马平台快速构建免费节点测试工具原型,十分钟完成开发
今天想和大家分享一个快速验证免费节点可用性的小工具开发过程。作为一个经常需要测试代理节点的开发者,手动一个个验证实在太费时间,于是我用InsCode(快马)平台快速搭建了一个原型工具,整个过程比想象中简单很多。 需求分析 免费节点测试工具…...
全新K4A4G165WG-BCWE000 4Gb DDR4 SDRAM 内存芯片 三星Samsung 进口芯片IC
K4A4G165WG-BCWE000 是三星半导体(Samsung)推出的一款4Gb DDR4 SDRAM 内存芯片,采用 96-ball FBGA 封装,组织为 256M 16 结构。它凭借 3200Mbps 的高数据速率、1.2V 低功耗设计以及 -40C 至 95C 的宽温工作能力,广泛应…...
Gorgonia性能优化终极指南:10个技巧让你的深度学习模型运行速度翻倍
Gorgonia性能优化终极指南:10个技巧让你的深度学习模型运行速度翻倍 【免费下载链接】gorgonia 项目地址: https://gitcode.com/gh_mirrors/gor/gorgonia Gorgonia是一个功能强大的深度学习框架,能够帮助开发者构建和训练复杂的神经网络模型。然…...
Deepfake Offensive Toolkit安全认证考试结果申诉处理流程
Deepfake Offensive Toolkit安全认证考试结果申诉处理流程 【免费下载链接】dot The Deepfake Offensive Toolkit 项目地址: https://gitcode.com/gh_mirrors/dot/dot Deepfake Offensive Toolkit(以下简称dot)作为一款专业的深度伪造工具&#x…...
RWKV7-1.5B-g1a多场景落地:HR部门用它自动生成岗位JD要点与面试问题清单
RWKV7-1.5B-g1a多场景落地:HR部门用它自动生成岗位JD要点与面试问题清单 1. 为什么HR部门需要AI助手 招聘工作中有大量重复性文案工作,比如: 为不同岗位编写职位描述(JD)设计结构化面试问题整理岗位核心能力要求制作候选人评估标准 传统方…...
Maxwell16.0实战:如何用实验电流数据搞定电机仿真(附.tab文件制作技巧)
Maxwell16.0实战:实验电流数据驱动电机仿真的全流程解析 电机仿真作为现代工业设计的重要环节,其准确性直接影响产品性能评估。而将实测电流数据融入仿真流程,往往是工程师突破"理想模型"局限的关键一步。本文将系统性地拆解从实验…...
抖音高效采集与无水印提取工具使用指南
抖音高效采集与无水印提取工具使用指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作与研究领域,高效的抖音资源管理已成为提升工作流的关键环节。本文将全面介绍一款功能强大的…...
BilibiliDown:你的专属B站视频管家,轻松下载与管理海量内容
BilibiliDown:你的专属B站视频管家,轻松下载与管理海量内容 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.…...
