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. 14.并发与异步 - 1.线程处理Thread -《果壳中的c#》

    14.2.1 创建一个线程 实例化一个Thread对象,然后调用它的Start方法,就可以创建和启动一个新的线程.最简单的Thread构造方法是接受一个ThreadStart代理:一个无参方法,表示执 ...

  2. 潭州课堂25班:Ph201805201 tornado 项目 第五课 增加用户系统-用户中心(课堂笔记)

    tornado 相关说明 在 users 表中创建记录,做测试 在项目根目录下创建 test.py # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2019/2/27 ...

  3. mysql Navicat 导入导出

    1.导出数据库:     打开Navicat ,在我们要导出的数据库上右击鼠标,然后弹出的快捷菜单上点击“转储SQL 文件”,(有些版本, 会有子菜单,在再次弹出的子菜单项中选择第一个“数据跟结构”) ...

  4. [LeetCode] Design Circular Queue 设计环形队列

    Design your implementation of the circular queue. The circular queue is a linear data structure in w ...

  5. AWS Nginx Started but not Serving AWS上Nginx服务器无法正常工作

    After install the Nginx on AWS instance, and visit your public ip address, you might see the followi ...

  6. JavaScript Dom级别

  7. js高级的2

    BOM0级事件元素绑定多个click最后只执行最后一个click. DOM2级事件元素绑定多个click,都要执行 注意当绑定的多个事件名,函数名,事件发生阶段三者完全一样时,才执行最后一个 div. ...

  8. XML自学笔记

    1.    xml指可扩展标记语言,(extensible markup language),该语言被设计用来传输和存储数据,HTML被设计用来显示数据 XML标签没有被预定义,需要自定义标签:XML ...

  9. php 二维数组根据值进行排序

    // 先获取要排序的值 $createTime = array_column($data, 'create_time'); // 排序成功 array_multisort($createTime, S ...

  10. Bear + Reminders 是完美的Thing 3 的替代品

    如今同类功能的APP在AppStore上呈现泛滥之势,尤其是时间管理.任务管理之类的APP.其中比较出名的就有“Things 3”这款APP,这是一款多年不更新,一更新就获奖的APP.目前在AppSt ...