C#事件实现文件下载时进度提醒
C#中的事件是建立在委托的基础上,标准的事件模型应该包括以下几点:
- 声明一个用于定义事件的委托,这里用系统自带的泛型委托原型EventHandler<TEventArgs>,如:public delegate void EventHandler<TEventArgs>(object sender,TEventArgs e);这里面的TEventArgs是由我们自定义的参数类型,继承自EventArgs基类
- 事件参数的名称以EventArgs结束
- 声明事件的委托原型即EventHandler,它的返回值为void
- 声明事件的委托原型即EventHandler,它有两个参数:sender和e,sender表示事件触发者,e表示事件触发时的参数
- 事件的声明是在普通委托声明的前面加上,event关键字,如:public event EventHandler<FileUploaderEventArgs> FileUploaded;
- 因为委托可以在外面由调用者决定其变化,而事件是由所在的类型本身决定变化
文件下载时,要实时更新进度条,这时更新进度的方法就应该由下载类在下载的同时根据实时的下载进度利用事件去同步更新进度条的值,代码如下:
1 namespace demo 2 { 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 private void button1_Click(object sender, EventArgs e) 11 { 12 FileUploader f1 = new FileUploader(); 13 f1.FileUploaded += ShowProcess; //绑定事件 14 ThreadPool.QueueUserWorkItem((a) => f1.Upload());//加入线程池 15 } 16 17 private void ShowProcess(object sender, FileUploaderEventArgs e) 18 { 19 //定义委托 20 Action t = () => 21 { 22 progressBar1.Value = e.FileProgress; 23 label1.Text = e.FileProgress.ToString(); 24 }; 25 26 //跨线程操作 27 this.BeginInvoke(t); 28 Thread.Sleep(500); 29 } 30 } 31 32 /// <summary> 33 /// 文件下载类 34 /// </summary> 35 class FileUploader 36 { 37 public event EventHandler<FileUploaderEventArgs> FileUploaded;//定义事件 38 public void Upload() 39 { 40 var e = new FileUploaderEventArgs() { FileProgress = 0 }; 41 while (e.FileProgress < 100) 42 { 43 e.FileProgress++; 44 FileUploaded(this, e);//触发事件 45 } 46 } 47 } 48 49 /// <summary> 50 /// 自定义参数 51 /// </summary> 52 class FileUploaderEventArgs : EventArgs 53 { 54 public int FileProgress { get; set; } 55 } 56 }
运行截图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库