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. Spring Boot 静态资源路径分析

    最近在接触一个看公司的java后台项目(采用的耶鲁大学开源的一个cas单点登录系统),用的是框架是Spring Boot,用的模板是Thymeleaf,于是我生成一个Spring Boot的项目,并且 ...

  2. fillder---工具栏隐藏/显示

    显示隐藏工具栏方法:view---show toolbar

  3. WRITE T AFTER ADVANCING 2 LINES

    WRITE T AFTER ADVANCING 2 LINES 意思是“在前进两行之后打印T记录内容”  (ADVANCING 和 LINE 字可省略) WRITE T BEFORE ADVANCIN ...

  4. 译:Dataiku 白皮书之《在银行和保险行业应用数据科学》

    原文链接:Data Science For Banking & Insurance 如果不能正常访问,请点击备份获取. 在银行和保险行业应用数据科学 互联网巨头和金融技术创业时代的求生和发展 ...

  5. jvm领域优秀博主

    dh5724 不过csdn iteye 博客园信息均被自己删除,只在一些问答中和引用中有部分信息. redcreen 对jvm有深入认知. RednaxelaFX oracle java 编译器开发者 ...

  6. docker备份mongodb数据,导入导出

    场景:服务器要升级,之前在linux部署的mongodb没有用docker,升级后,mongodb要用docker部署,并将原有的mongodb数据导入到docker部署的mongodb中. 1.在l ...

  7. 网络流 最大流—最小割 之SAP算法 详解

    首先引入几个新名词: 1.距离标号: 所谓距离标号 ,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度). 设点i的标号为level[i],那么如果将满足level[i]=l ...

  8. 变量类型-String

    教程:一:字符串的创建 用单引号.双引号括起来,同时用转义字符转义 二:字符串的索引 变量[头标:尾标]    从前到后:0---end    从后到前:-1---->-len(str)三:获取 ...

  9. OO第一单元总结

    OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...

  10. keepalived + nginx 实现双机热备

    # docker run -itd --name centos_m1 centos # 进入容器 # docker exec -it centos_m1 /bin/bash # 安装nginx # r ...