1.事件的含义

事件和异常类似,它们都是由对象引发,我们可以提供代码处理它们。不同的是事件并没有使用try ..catch这样的代码来处理,而是要订阅事件,订阅的含义是提供一段事件处理代码,在事件发送时执行这段代码,这段代码也称为事件处理程序。

单个事件可以提供多个事件处理程序,每个事件处理程序都会执行。

事件的本质是一个event修饰的委托。

2.实现自定义事件的步骤

1)创建委托;

2)定义事件;

3)编写事件处理程序;

4)订阅事件。

比如我们有一个即时消息的应用程序,Connection表示用户建立的一个远程连接,当远程连接收到客户的信息时即刻显示出来。

public class MessageArrivedEvnetArgs:EventArgs
{
private string message;
public string Message
{
get { return message; }
} public MessageArrivedEvnetArgs()
{
message = "No Message Sent.";
} public MessageArrivedEvnetArgs(string message)
{
this.message = message;
}
} public delegate void MessageHandler(Connection sender,MessageArrivedEvnetArgs e);//1.定义委托
public class Connection
{ public event MessageHandler MessageArrived;//2.定义事件 public string name;
private Timer pollTimer;
private Random random = new Random(); public Connection(string name)
{
this.name = name;
pollTimer = new Timer();
pollTimer.Elapsed +=new ElapsedEventHandler(CheckForMessage);//订阅事件
} public void Connect()
{
pollTimer.Start();
} public void DisConnected()
{
pollTimer.Stop();
} public void CheckForMessage(object sender, ElapsedEventArgs e)
{
if (random.Next() == && this.MessageArrived != null)//触发事件
{
MessageArrived(this,new MessageArrivedEvnetArgs("Hollo Mum!"));
}
}
} class Display
{
public void DisplayMessage(Connection sender, MessageArrivedEvnetArgs e)//3.编写时间处理程序
{
Console.WriteLine("Form:" + sender.name );
Console.WriteLine("Message :"+ e.Message);
} } class Program
{
static void Main(string[] args)
{
Connection con = new Connection("Conn1");
Display displayer = new Display();
con.MessageArrived += new MessageHandler(displayer.DisplayMessage); Connection con2 = new Connection("Conn2");
con2.MessageArrived += new MessageHandler(displayer.DisplayMessage);//4.订阅事件
con2.Connect();
Console.ReadLine();
}
}

3.事件参数的含义

一般的事件都有两个参数,比如 Timer.Elapsed事件中

object sender是指引发事件的对象本身

ElapsedEventArgs e是事件传递的信息

 public void CheckForMessage(object sender, ElapsedEventArgs e)
{
if (random.Next() == && this.MessageArrived != null)//触发事件
{
MessageArrived(this,new MessageArrivedEvnetArgs("Hollo Mum!"));
}
}

在通用的事件处理程序中,一个事件处理程序可能关联了几个对象产生的事件,可以通过sender判断引发事件的对象是什么,进而做针对性的操作。

一般的事件,比如Click事件都使用EventArgs对象传递信息,实际上它并没有传递什么信息,如果需要传递自己的信息,可以继承EventArgs并添加自己的属性,比如ElapsedEventArgs

    // 摘要:
// 为 System.Timers.Timer.Elapsed 事件提供数据。
public class ElapsedEventArgs : EventArgs
{
// 摘要:
// 获取引发 System.Timers.Timer.Elapsed 事件的时间。
//
// 返回结果:
// 引发 System.Timers.Timer.Elapsed 事件的时间。
public DateTime SignalTime { get; }
}

 4.EventHandler<T>

EventHandler<T>强类型化时间第二个参数为T类型,他的定义如下

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

使用EventHandler<T>可以以另一个种方式定义事件

   public class MessageArrivedEvnetArgs:EventArgs
{
private string message;
public string Message
{
get { return message; }
} public MessageArrivedEvnetArgs()
{
message = "No Message Sent.";
} public MessageArrivedEvnetArgs(string message)
{
this.message = message;
}
} public class Connection
{ //public event MessageHandler MessageArrived;//2.定义事件
public event EventHandler<MessageArrivedEvnetArgs> MessageArrived;//2.定义事件
public string name;
private Timer pollTimer;
private Random random = new Random(); public Connection(string name)
{
this.name = name;
pollTimer = new Timer();
pollTimer.Elapsed +=new ElapsedEventHandler(CheckForMessage);//订阅事件
} public void Connect()
{
pollTimer.Start();
} public void DisConnected()
{
pollTimer.Stop();
} public void CheckForMessage(object sender, ElapsedEventArgs e)
{
if (random.Next() == && this.MessageArrived != null)//触发事件
{
MessageArrived(this,new MessageArrivedEvnetArgs("Hollo Mum!"));
}
}
} class Display
{
public void DisplayMessage(Connection sender, MessageArrivedEvnetArgs e)//3.编写时间处理程序
{
Console.WriteLine("Form:" + sender.name );
Console.WriteLine("Message :"+ e.Message);
} public void DisplayMessage2(object sender, MessageArrivedEvnetArgs e)//3.编写时间处理程序
{
Console.WriteLine("Form2:" + ((Connection)sender).name);
Console.WriteLine("Message2 :" + e.Message);
}
} class Program
{ static void Main(string[] args)
{ Connection con = new Connection("con1"); Display d = new Display();
con.MessageArrived += new EventHandler<MessageArrivedEvnetArgs>(d.DisplayMessage2);
con.Connect(); Console.ReadLine();
}
}

22.C# 事件的更多相关文章

  1. C#面向对象22 委托事件反射

    1.委托的定义:声明委托类型(返回值和参数,命名空间中):定义委托对象 (把委托想象成函数中的占位符~因为你并不确定调用哪个函数~) using System; using System.Collec ...

  2. 22 Jquery 事件

    一.概述: 当用户与浏览器进行交互时这些方法被用于注册行为生效, 并进一步处理这些注册行为. 二.绑定事件处理器 .bind() ..unbind():为一个元素绑定一个事件处理程序.3.0版本已经弃 ...

  3. C#委托与事件总结

    目录 C#委托与事件的总结 1.概述 2.委托 2.1 什么是委托 2.2 委託的使用 2.3 深入理解委托 2.4 为什么要使用委托 2.5 代码清单 3.事件 3.1 事件与委托的关系 3.2 订 ...

  4. Springboot中的事件Event

    事件Event作为一种常用的线程通讯工具,在Springboot中可以方便地提供开发者进行线程交互. 1.事件定义 1 import org.springframework.context.Appli ...

  5. jquery事件之事件

    事件名 说明 语法 (events 事件类型,data数据,handler 事件处理函数,selector 选择器) blur() 获得失去鼠标光标焦点事件 jQueryObject.blur( [ ...

  6. libevent中的事件机制

    libevent是事件驱动的网络库,事件驱动是他的核心,所以理解事件驱动对于理解整个网络库有很重要的意义.       本着从简入繁,今天分析下单线程最简单的事件触发.通过sample下的event- ...

  7. JS技巧

    2016-08-09 200多个js技巧代码(Down) word下载 200多个js技巧代码 目录 1.文本框焦点问题... 6 2.网页按钮的特殊颜色... 6 3.鼠标移入移出时颜色变化... ...

  8. 黑马程序员----java基础笔记下(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 目录--- 21.字符编码 22.javaswig 事件 23.socket 网络通讯 24.网 ...

  9. 多个提高C#编程能力的建议

    1.总是用属性 (Property) 来代替可访问的数据成员 2.在 readonly 和 const 之间,优先使用 readonly 3.在 as 和 强制类型转换之间,优先使用 as 操作符 4 ...

随机推荐

  1. day14.生成器进阶,推导式

    生成器中取值的三种方法 方法1:next() 方法2:for 循环 方法3:数据类型的强制转换 def func(): for i in range(20): yield '赛车*{}'.format ...

  2. python数据类型——数据转换

    数据类型有很多种,比如数值和字符,比如6和a,字符是需要加双引号的,下面的例子运行的结果是不一样的,数值会相加而字符会相连 print(6+6)print("6"+"6& ...

  3. 整理一下python中with的用法

    ith替代了之前在python里使用try...finally来做清理工作的方法.基本形式如下: with expression [as variable]: with-block 当expressi ...

  4. 从Github上将laravel项目拉到新开发环境

    1.从github上将项目拉到本地 默认主分支:git clone https://github.com/my-user-name/my-project  /home/vagrant/laravel/ ...

  5. 微信小程序--家庭记账本开发--02

    代码文件的了解 对于一个程序的开发,代码的了解的必须的,不同的后缀名文件有着不同的作用,通过学习,对于微信小程序开发中的文件有了自己的理解. 文件概述 一个微信小程序一般有有pages文件夹,util ...

  6. jmeter之JDBC Request各种数据库配置

    URL和JDBC驱动: Datebase Driver class Database URL MySQL com.mysql.jdbc.Driver jdbc:mysql://host:port/{d ...

  7. sql的基础用法

    # sql 对大小写不敏感 # 查询表中的所有信息 select * from `Customers`; # 查询指定字段 CustomerName,Country select CustomerNa ...

  8. Oracle Sequence创建与使用

    一.Sequence简介 Sequence是数据库系统按照一定的规则自动增加的数字序列,主要用于生成数据库数据记录.这个序列一般作为代理主键(因为不会重复). Sequence是数据中一个特殊存放等差 ...

  9. 第三周学习java第四章学习总结及体会!

    第三周java 2第四章的学习总结: 一.主要内容(类与对象): 1.类: 2.构造方法与对象的创建: 3.类与程序的基本结构: 4.参数传值: 5.对象的组合: 6.实例成员与类成员: 7.方法重载 ...

  10. C++ 编译发现 error C2146: syntax error : missing ';' before identifier 'm_ctrlserver'

    解决这个问题的根源是重复包含了头文件