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. docker-- 卷

    进入容器centos终端中 #docker   attach   c1 在 容器中安装nginx #yum   install  epel-relesae #yum  install  nginx # ...

  2. 遍历文件路径python版,java版

    python: # 获取所有txt路径列表 file_list = [] def gci(filepath): files=os.listdir(filepath) for fi in files: ...

  3. Round#534 div.2-B Game with string

    唔,第一次参加,掉了好多分. http://codeforces.com/contest/1104/problem/B 不用考虑太多,string真的好厉害. #include<stdio.h& ...

  4. C#中new的三种用法

    在 C# 中,new 关键字可用作运算符.修饰符或约束. 1)new 运算符:用于创建对象和调用构造函数. 2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员. 3)new ...

  5. 动态规划——Edit Distance

    大意:给定两个字符串word1和word2,为了使word1变为word2,可以进行增加.删除.替换字符三种操作,请输出操作的最少次数   Example 1: Input: word1 = &quo ...

  6. 使用ngnix做服务器的负载均衡

    (1)  进程数与每个进程的最大连接数: nginx进程数,建议设置为等于CPU总核心数 单个进程最大连接数,那么该服务器的最大连接数=连接数*进程数 (2) Ngnix的基本配置 监听端口一般都为h ...

  7. TCP三次握手四次挥手最通俗理解

    工作过程TCP标志位:TCP共有6个标志位,分别是: SYN(synchronous),建立联机.ACK(acknowledgement),确认.PSH(push),传输.FIN(finish),结束 ...

  8. Python练手例子(3)

    13.打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...

  9. SSIS - 1.简介

    一.什么是SSIS? 1)SSIS全称为Microsoft SQL Server Integration Services. 2)ETL全称为Extraction, Transformation an ...

  10. disconf安装问题

    安装参考文档:https://blog.csdn.net/fengyao1995/article/details/66491226 主要说说遇到的几个问题 1.在步骤6构建的时候,用jdk1.8,进行 ...