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;
  • 因为委托可以在外面由调用者决定其变化,而事件是由所在的类型本身决定变化

文件下载时,要实时更新进度条,这时更新进度的方法就应该由下载类在下载的同时根据实时的下载进度利用事件去同步更新进度条的值,代码如下:

 namespace demo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
FileUploader f1 = new FileUploader();
f1.FileUploaded += ShowProcess; //绑定事件
ThreadPool.QueueUserWorkItem((a) => f1.Upload());//加入线程池
} private void ShowProcess(object sender, FileUploaderEventArgs e)
{
//定义委托
Action t = () =>
{
progressBar1.Value = e.FileProgress;
label1.Text = e.FileProgress.ToString();
}; //跨线程操作
this.BeginInvoke(t);
Thread.Sleep();
}
} /// <summary>
/// 文件下载类
/// </summary>
class FileUploader
{
public event EventHandler<FileUploaderEventArgs> FileUploaded;//定义事件
public void Upload()
{
var e = new FileUploaderEventArgs() { FileProgress = };
while (e.FileProgress < )
{
e.FileProgress++;
FileUploaded(this, e);//触发事件
}
}
} /// <summary>
/// 自定义参数
/// </summary>
class FileUploaderEventArgs : EventArgs
{
public int FileProgress { get; set; }
}
}

运行截图:

最新文章

  1. UWP 解决Webview在Pivot里面无法左右滑动的问题
  2. ember.js:使用笔记1-数组数据统一显示
  3. 【Unity3D游戏开发】之全局管理类的几种方式 (十六)
  4. 什么是automatic variable?
  5. 矩阵乘法 codevs 1287 矩阵乘法
  6. CodeIgniter框架中关于URL(index.php)的那些事
  7. Entity Framework 不支持DefaultValue
  8. Httpclient 和jsoup结和提取网页内容(某客学院视频链接)
  9. java文件IO操作
  10. 在其它路径新建cocos2d-x项目
  11. 通过枚举enum实现单例设计
  12. C#调用WebService实例和开发
  13. cocos2dx之lua项目开发中MVC框架的简单应用
  14. 字符设备 Vs. 块设备 Character Device Vs. Block Device
  15. 介绍几个好用的android自定义控件
  16. linux学习之路(3)
  17. 详解mybatis配置文件
  18. Vray
  19. No趴笨小分队
  20. centos6.9安装oracle11g

热门文章

  1. 设置快捷键 让word轻松实现无格式粘贴
  2. BZOJ3173 TJOI2013最长上升子序列(splay)
  3. MySQL 大表备份、改表
  4. C++ 数据结构概念
  5. BZOJ3155:Preprefix sum——题解
  6. BZOJ 1014 火星人 | 平衡树维护哈希
  7. 浅谈Tarjan算法及思想
  8. CF17E Palisection——优秀的综合计数题
  9. [USACO18OPEN]Talent Show
  10. python入门:1-100所有数的和