C#_事件
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#_事件的更多相关文章
- DotNetCore跨平台~服务总线_事件总线的重新设计
理论闲话 之前在.netFramework平台用的好好的,可升级到.net core平台之后,由于不再需要二进制序列化,导致咱们的事件机制遇到了问题,之前大叔的事件一直是将处理程序序列化后进行存储的, ...
- 第9章 用内核对象进行线程同步(1)_事件对象(Event)
9.1 等待函数 (1)WaitForSingleObject(hObject,dwMilliseonds); ①dwMilliseconds为INFINITE时表示无限等待 ②dwMilliseco ...
- C#_事件委托
CarDealer类 事件发布程序 using System; using System.Collections.Generic; using System.Linq; using System.Te ...
- C#_串口程序_二次打包_事件响应
using System;using System.IO.Ports;using System.Windows.Forms; namespace Dll_Serial_Comm{ public ...
- 图解C#_事件
概述 今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoadEvent ...
- jQuery_第五章_事件和动画
Jquery中的事件与动画 一.window.onload和$(document).read()的细微差别 (1)执行时机 window.onload:所有元素(包括元素的所有关联文件)完全加载到浏览 ...
- jquery父元素和子元素点击事件传递问题_不可把父元素的事件传递给子元素_事件无限循环传递
前述:jquery中: 当一个元素的点击事件被触发时,会自动将该事件向父级元素逐级专递. 但是实际场景当中,我们可能会遇到需要在父级元素中定义点击事件,来触发特定子元素的点击事件,我就遇到了这么一个问 ...
- (92)Wangdao.com_第二十五天_线程机制_H5 Web Workers 分线程任务_事件 Event
浏览器内核 支撑浏览器运行的最核心的程序 IE 浏览器内核 Trident内核,也是俗称的IE内核Chrome 浏览器内核 统称为 Chromium 内核或 ...
- vue_事件绑定 v-on _事件修饰符
事件绑定 v-on 传参的同时,接收事件对象 <button @click="test('111', $evnt)">哈哈</button> 事件修饰符 阻 ...
随机推荐
- Python网络编程——通过指定的端口和协议找到服务名
1.通过指定的端口和协议找到对应的服务名,采用socket中getservbyprot()函数实现. import socket def find_service_name(): protocolna ...
- 如何用java比较两个时间或日期的大小
有一个字符串的时间,比如"2012-12-31 16:18:36" 与另一个时间做比较,如果前者比后者早,则返回true,否则返回false. 为此,我设计了一个方法. impor ...
- thinkphp 常用的查询
php 常用的数据库查询方式: //根据where 条件查询,使用select()方法 访问:http://localhost/thinkphp2/index.php/Machine/search_i ...
- php 用户访问菜单页面,必须登录,判断用户是否登录
<pre name="code" class="python"># 本节课大纲: 一.空模块和空操作 1.空操作 function _empty($ ...
- 《Python学习手册》
读书笔记请见Github博客:http://wuxichen.github.io/Myblog/reading/2014/10/04/LearningPython.html
- iOS中谓词的使用
Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数.在cocoa ...
- linux grep详解
Table of Contents 1. grep简介 2. grep正则表达式元字符集(基本集) 3. 用于egrep和 grep -E的元字符扩展集 4. POSIX字符类 5. Grep命令选项 ...
- Unity的Cover flow的实现包(2个)
苹果的mac机上预览图片,有一个所谓的cover flow的效果,这里收集到两个,两个实现效果略有不同. 1.老外的实现 https://github.com/rakkarage/Unity3D-Co ...
- POJ 3276 Face The Right Way 翻转(开关问题)
题目:Click here 题意:n头牛排成一列,F表示牛面朝前方,B表示面朝后方,每次转向K头连续的牛的朝向,求让所有的牛都能面向前方需要的最少的操作次数M和对应的最小的K. 分析:一个区间反转偶数 ...
- 【QT相关】类头文件解读、QT编辑模式、读取text文本
Wizard产生的头文件类包含了必须的#include文件.构造函数.析构函数和UI对象: #include <QMainWindow> namespace Ui {class Notep ...