图解C#_事件

概述

今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoadEventArgs类来封装,这个消息类中定义一个percent字段,用来保存当前已下载文件的百分比,下面请看官欣赏过程:

一、定义要发送给用户(订阅事件者)的消息类



 1     internal class DownLoadEventArgs: EventArgs
 2     {
 3         private readonly Int32 _percent;     //文件下载百分比
 4         public DownLoadEventArgs(Int32 percent)
 5         {
 6             _percent = percent;
 7         }
 8
 9         public Int32 Percent
10         {
11             get
12             {
13                 return _percent;
14             }
15         }
16     }

二、定义文件下载类

这个类中定义一个DownLoad事件,一个当事件发生时通知用户(事件订阅者)的方法OnFileDownloaded,一个文件下载方法FileDownload,如下:

 1 internal class FileManager
 2     {
 3         public event EventHandler<DownLoadEventArgs> DownLoad;      //定义事件
 4
 5
 6         protected virtual void OnFileDownloaded(DownLoadEventArgs e)
 7         {
 8             EventHandler<DownLoadEventArgs> temp = DownLoad;
 9             if(temp != null)
10             {
11                 temp(this, e);
12             }
13         }
14
15         public void FileDownload(string url)
16         {
17             int percent = 0;
18             while(percent <= 100)
19             {
20                 //模拟下载文件
21                 ++percent;
22                 DownLoadEventArgs e = new DownLoadEventArgs(percent);
23                 OnFileDownloaded(e);   //事件触发,向订阅者发送消息(下载百分比的值)
24
25                 Thread.Sleep(1000);
26             }
27         }
28     }

三、客户端订阅事件

在客户端实例化文件下载类,然后绑定事件,如下:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             FileManager manager = new FileManager();
 6             manager.DownLoad += Manager_DownLoad;              //订阅事件
 7             manager.FileDownload("http://asdfwqerqasdfs.zip"); //下载文件
 8         }
 9
10         /// <summary>
11         /// 接到事件通知后要执行的方法
12         /// </summary>
13         /// <param name="sender">事件触发对象</param>
14         /// <param name="e">事件发送过来的消息(百分比)</param>
15         private static void Manager_DownLoad(object sender, DownLoadEventArgs e)
16         {
17             Console.WriteLine(string.Format("文件已下载:{0}%", e.Percent.ToString()));
18         }
19     }

四、显示结果

五、图示

六、个人理解

其实事件就是用将一系列订阅方法绑定在一个委托上,当方法执行时,触发到该事件时,就会按通知绑定在委托上的方法去执行。

总结

写博客不容易,尤其是对我这样的c#新人,如果大家觉得写的还好,请点赞或打赏支持,我会更加努力写文章的。

时间: 2024-12-18 04:05:10

图解C#_事件的相关文章

DotNetCore跨平台~服务总线_事件总线的重新设计

回到目录 理论闲话 之前在.netFramework平台用的好好的,可升级到.net core平台之后,由于不再需要二进制序列化,导致咱们的事件机制遇到了问题,之前大叔的事件一直是将处理程序序列化后进行存储的,处理存储的参数为事件源,一个事件源可以由多个处理程序订阅,当事件源被发布时,这些被序列化的代码段会被回调执行,这是大叔之前的思路,在RedisBus和MemoryBus里已经得到了实现,读过大叔源代码的同学应该有所了解了. 事件源和处理程序 /// <summary> /// 事件源 /

JavaScript的事件对象_事件流

事件流事件流是描述的从页面接受事件的顺序,当几个都具有事件的元素层叠在一起的时候,那么你点击其中一个元素,并不是只有当前被点击的元素会触发事件,而层叠在你点击范围的所有元素都会触发事件.事件流包括两种模式:冒泡和捕获. 事件冒泡,是从里往外逐个触发.事件捕获,是从外往里逐个触发.那么现代的浏览器默认情况下都是冒泡模型,而捕获模式则是早期的 Netscape 默认情况.而现在的浏览器要使用 DOM2 级模型的事件绑定机制才能手动定义事件流模式. <script type="text/java

JavaScript的事件_事件概述/事件模型

一.事件概述 JavaScript 事件是由访问 Web 页面的用户引起的一系列操作,例如:用户点击页面上的某个按钮或者鼠标移动到页面的某个图片上而产生一系列的互动的反馈. 当用户执行某些操作的时候,再去执行一系列代码. 事件一般是用于浏览器和用户操作进行交互.最早是 IE 和 Netscape Navigator 中出现,作为分担服务器端运算负载的一种手段.直到几乎所有的浏览器都支持事件处理. 而 DOM2级规范开始尝试以一种复合逻辑的方式标准化 DOM 事件.IE9.Firefox.Oper

第3章_事件

1 在页面加载后执行任务 $(document).ready()是jQuery基于页面加载    执行任务的一种主要方式. 原生的window.onload事件也可以实现相同的效果. 但它们在触发操作的时间上存在着微妙的差异(在加载的资源多到一定程度时会体现出来) 通过JavaScript(而不是指 直接在HTML中 添加处理程序属性) 注册 事件处理程序 的传统机制是: 把一个函数  指定给 DOM元素的对应属性. 如已经定义了 function doStuff() { } 那么,以下两种方式

(92)Wangdao.com_第二十五天_事件 Event

1. 事件 Event 事件的本质是: 程序各个组成部分之间的一种通信方式,也是 异步编程 的一种实现 DOM 的事件操作 分为: 监听 和 触发        都定义在 EventTarget 接口____ 所有节点对象都部署了 EventTarget 接口,其他一些需要事件通信的浏览器内置对象(比如,XMLHttpRequest.AudioNode.AudioContext)也部署了这个接口. .addEventListener();        绑定事件的监听函数 .removeEven

3. 闭包_对象组合继承模式_事件轮询机制

1.谈谈闭包? (产生条件.是什么.在哪里.作用.生命周期.缺点) 产生闭包的三个条件: 函数嵌套 内部函数引用外部函数的局部变量 执行外部函数 包含被引用的局部变量的一个"对象",  通过 chrome 开发者工具可以调试查看到,就是 closure,它存在嵌套的内部函数中 作用: 延长了局部变量的存活时间, 让函数外部可以操作(读写)到函数内部的数据(变量/函数) 闭包的生命周期: 产生 :  在嵌套内部函数定义执行完时就产生了(不是在调用) 死亡 :  在嵌套的内部函数成为垃圾对

节点_元素的创建_事件

节点: 节点及相关的概念:  注: 根元素是 html 标签. 现在来了需求:获取div 中的每个标签,并设置每个标签的背景颜色!(这里如果使用之前的方式就很不方便,下面使用节点的方式) 注:使用节点获取任意一个标签中的元素都是非常方便的. 节点相关的属性: 节点都有三个属性: 一是:nodeType 二是:nodeName 三是:  nodeValue . 节点大致分三类: 标签节点,文本节点,属性节点,如下图: 节点的属性:可以使用标签节点 点出来,可以使用文本节点点出出来,可以使用属性节点

线程_事件

线程的一个关键特性是每个线程都是独立运行且状态不可预测. 如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时我们需要使用threading库中的Event对象. event.set():设置事件状态为True event.wait ():等待event.set 把事件状态设置为True event.is_set():检查事件状态是否为True #事件 from threading import Thread,current_thread,Event import thre

《CLR via C#》中事件一章的笔记

我也人模人样的写一些笔记 帮助自己这个大菜鸟记得更牢 先解释下几个概念: 委托:是用来存储方法的类型 委托变量可以传递 使得方法也可以像变量一样传递.所以类中的事件成员也是委托类型=>事件要存储方法. 订阅事件:指的是向事件提供类的实例的事件(public)登记(+=)自己的回调方法,称为订阅事件,一旦事件发生,回调方法被执行,回调方法可以按照自己的方式处理来自事件的参数(sender,e),称为接受来自事件的通知. 1.事件应该能够传递事件的信息 所以要定义一个类型来包容要发送给事件接受者(就