C# 事件基础知识

事件是什么

一个事件代表程序中发生一件显著事情的信号。它包括事件的发送方和接收方。我们把触发事件的对象称为事件的发送者,响应事件的对象称为事件的接收者。在C#中,事件和委托经常联系在一块,他们的关系就是对象和类的关系。

在C#的窗体应用开发中,.NET 中预定义了许多种专门用于事件的委托类型,比如 EventHandler、 KeyEventHandler、 MouseEventHandler 等。因此这里主要介绍怎么自定义一个事件。

怎么使用事件

(1)使用事件其实就是一个创建事件驱动程序的过程。一般采取的步骤如下:

1.声明关于事件的委托;
     2.声明事件;
     3.编写触发事件的函数;
     4.创建事件处理程序;
     5.注册事件处理程序;
     6.在适当的条件下触发事件。

(2) 编写一个自定义事件。

深林里有一只兔子和一只羊,晚上兔子睡觉的时候,羊负责看守洞口。如果有狼出没,羊就发出一个 Alarm 事件,兔子接到 Alarm 事件后就和羊一起采取行动。假设狼于 2017 年8月3日晚上12点整到达。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace eventDemo
 8 {
 9     class Sheep
10     {
11         //1.声明关于事件的委托;
12         public delegate void AlarmEventHandler(object sender, EventArgs e);
13
14         //2.使用event关键字声明事件;
15         public event AlarmEventHandler Alarm;
16
17         public void OnAlarm()      //3.编写引发事件的函数;
18         {
19             if (this.Alarm != null)
20                 this.Alarm(this, new EventArgs()); //发出警报
21         }
22     }
23         //事件接收者
24     class Rabbit
25     {
26         //4.编写事件处理程序
27         void RabbitHandleAlarm(object sender, EventArgs e)
28         {
29             Console.WriteLine("兔子: 狼来啦,快躲起来! ");
30         }
31         //5.注册事件处理程序;
32         public Rabbit(Sheep sheep)
33         {
34             sheep.Alarm += new Sheep.AlarmEventHandler(RabbitHandleAlarm);
35         }
36     }
37     //6.现在来触发事件
38     class Program
39     {
40         static void Main(string[] args)
41         {
42             Sheep sheep = new Sheep();
43             Rabbit rabbit = new Rabbit(sheep);
44             DateTime now = new DateTime(2017, 8, 2, 23, 59, 55);
45             DateTime midnight = new DateTime(2017, 8, 3, 0, 0, 0);
46             Console.WriteLine("时间一秒一秒地流逝,等待午夜的到来... ");
47             while (true)
48             {
49                 Console.WriteLine("当前时间: " + now);
50                 //午夜零点狼出没,羊引发 Alarm 事件
51                 if (now == midnight)
52                 {
53                     Console.WriteLine("\n 沙沙沙, 狼悄悄地来到了羊的附近...");
54                     //引发事件
55                     Console.WriteLine("\n 羊报警: 有狼出没,咩~~~~~~~");
56                     sheep.OnAlarm();
57                     break;
58                 }
59                 System.Threading.Thread.Sleep(1000); //程序暂停一秒
60                 now = now.AddSeconds(1); //时间增加一秒
61             }
62         }
63     }
64 }

当午夜时分小偷到达时, sheep 调用 sheep.OnAlarm()函数,从而触发 Alarm 事件,于是系统找到并执行了注册在 Alarm 事件中的事件处理程序 RabbitHandleAlarm()。引发事件的代码
(即 OnAlarm()函数)和事件处理程序是分离的,引发事件的代码只管调用“Alarm()”,而事件处理程序另外独立定义,它们之间通过事件 Alarm 联系起来。

注意事项

事件处理程序的参数应该和事件委托相同。一般情况下,事件处理程序接受两个参数,

一个是事件的发送者sender,一个是事件参数e 。

Ending.....

时间: 2024-08-01 14:12:49

C# 事件基础知识的相关文章

DOM0,DOM2,DOM3事件,事件基础知识入门

事件是javascript和HTML交互基础, 任何文档或者浏览器窗口发生的交互, 都要通过绑定事件进行交互; 事件有DOM0, DOM2和DOM3的区分(别问我怎么少了一个DOM1, 也没找到DOM1的信息啊,); DOM0就是直接通过 onclick写在html里面的事件, 比如: <input onclick="alert(1)" /> DOM2是通过addEventListener绑定的事件, 还有IE下的DOM2事件通过attachEvent绑定; DOM3是一些

jQuery 语法-选择器-事件(基础知识)

jQuery 语法 jQuery 语法是通过选取 HTML 元素的,并对元素执行某些操作 基础语法: $(selector).action() 美元符号定义 jQuery 选择符(selector)"查询"和"查找" HTML 元素 jQuery 的 action() 执行对元素的操作 实例: $(this).hide() - 隐藏当前元素 $("p").hide() - 隐藏所有段落 $("p.test").hide() -

JavaScript事件基础知识总结【思维导图】

var EventUtil = { //注册事件 addHandler: function(element, type, handler){ if (element.addEventListener){ element.addEventListener(type, handler, false); } else if (element.attachEvent){ element.attachEvent("on" + type, handler); } else { element[&q

asp.net架构基础知识--页面以及全局事件

1.asp.net的请求过程,以及对应的处理请求的dll客户的请求页面由aspnet_isapi.dll这个动态连接库来处理,把请求的aspx文件发送给CLR进行编译执行,然后把Html流返回给浏览器 2.页面事件(按照事件的执行顺序排列) Page_Init:初始化值或连接 Page_Load:主要使用IsPostBack,该事件主要执行一系列得操作来首次创建asp.net页面或响应 由投递引起得客户端事件.在此事件之前,已还原页面和控件视图状态. Page_DataBind:在页面级别上调用

C#基础知识之事件和委托

本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 委托的引入:将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语: public void GreetPeople(string name) { EnglishGreeting(name); } public

BroadcastReceive基础知识总结

BroadcastReceive基础知识总结 1.BroadcastReceive简介 BroadcastReceive也就是"广播接收者"的意思,顾名思义,就是用来接收来自系统和应用中的广播 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能,当网络状态改变时,系统会产生一条广播,接收到这条广播,就能及时的做出提示和保存数据等操作,当电池的电量改变的时候,系统会产生一条广播,接收到这条广播就能在电量低的时候告知用户

线程基础知识

什么是线程: 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列" 一切进程至少都有一个执行线程 进程与线程 进程是资源竞争的基本单位 线程是程序执行的最小单位 线程共享进程数据,但也拥有自己的一部分数据 线程ID 一组寄存器 栈 errno 信号状态 优先级 fork和创建新线程的区别 当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它自己的PID.这个新进程的运行时间是独立的,它在执行时几乎

JSP SERVLET 基础知识

jsp(java server page)和servlet是JAVA EE规范的两个基本成员,是JAVA WEB开发的重点也是基础知识.JSP本质上也需要编译成SERVLET运行. JSP比较简单,可以理解为在HTML页面中嵌入JAVA代码,或使用各种JSP标签,再辅以各种JAVA BEAN. <!-- JSP声明 --> <%! public String info(){return "Hello jsp";} %> <div> <!-- J

多线程编程基础知识

多线程编程基础知识 http://www.cnblogs.com/cy163/archive/2006/11/02/547428.html 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握