22.C# 事件
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# 事件的更多相关文章
- C#面向对象22 委托事件反射
1.委托的定义:声明委托类型(返回值和参数,命名空间中):定义委托对象 (把委托想象成函数中的占位符~因为你并不确定调用哪个函数~) using System; using System.Collec ...
- 22 Jquery 事件
一.概述: 当用户与浏览器进行交互时这些方法被用于注册行为生效, 并进一步处理这些注册行为. 二.绑定事件处理器 .bind() ..unbind():为一个元素绑定一个事件处理程序.3.0版本已经弃 ...
- C#委托与事件总结
目录 C#委托与事件的总结 1.概述 2.委托 2.1 什么是委托 2.2 委託的使用 2.3 深入理解委托 2.4 为什么要使用委托 2.5 代码清单 3.事件 3.1 事件与委托的关系 3.2 订 ...
- Springboot中的事件Event
事件Event作为一种常用的线程通讯工具,在Springboot中可以方便地提供开发者进行线程交互. 1.事件定义 1 import org.springframework.context.Appli ...
- jquery事件之事件
事件名 说明 语法 (events 事件类型,data数据,handler 事件处理函数,selector 选择器) blur() 获得失去鼠标光标焦点事件 jQueryObject.blur( [ ...
- libevent中的事件机制
libevent是事件驱动的网络库,事件驱动是他的核心,所以理解事件驱动对于理解整个网络库有很重要的意义. 本着从简入繁,今天分析下单线程最简单的事件触发.通过sample下的event- ...
- JS技巧
2016-08-09 200多个js技巧代码(Down) word下载 200多个js技巧代码 目录 1.文本框焦点问题... 6 2.网页按钮的特殊颜色... 6 3.鼠标移入移出时颜色变化... ...
- 黑马程序员----java基础笔记下(毕向东)
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 目录--- 21.字符编码 22.javaswig 事件 23.socket 网络通讯 24.网 ...
- 多个提高C#编程能力的建议
1.总是用属性 (Property) 来代替可访问的数据成员 2.在 readonly 和 const 之间,优先使用 readonly 3.在 as 和 强制类型转换之间,优先使用 as 操作符 4 ...
随机推荐
- js分析 快速定位 js 代码, 还原被混淆压缩的 js 代码
-1.目录 0.参考 1.页面表现 2. 慢镜头观察:低速网络请求 3. 从头到尾调试:Fiddler 拦截 index.html 并添加 debugger; 4. 快速定位 js 代码 5. 还原被 ...
- Cpp Generals 1.2
原文链接https://www.cnblogs.com/zhouzhendong/p/Cpp-Generals.html 源码暂不公开 下载链接 适用系统: Windows: 运行时请在进入彩色界面之 ...
- Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第六集之基本命令使用】
学习命令的方法:linux中所有操作都是命令操作,可想而知命令有多少,更严重的是每个命令有很多参数,记命令容易,记参数就难了,所以建议: 自己准备一个博客,把通常用到的命令及其功能记载下来,用到的时候 ...
- 关于python3.6上传文件时报错:HTTPSConnectionPool(host='***.org', port=443): Max retries exceeded with url: /post (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAIL解决办法
第一个报错: 最近在练习post请求中上传文件时遇到了一个奇葩事情,两台电脑上写了一模一样的代码,一个运行正常,另一个一片红. 最后了解了一下原因以及解决办法.先记录下关键代码: files = {& ...
- Linux 添加到环境变量
在Linux下使用源码安装软件的时候,通常只能在软件安装目录下使用该软件命令,这样太麻烦,我们希望全局使用,可以将软件安装路径添加到系统环境变量里. 添加环境变量有2种方法: 1. 使用export命 ...
- Ubuntu14.04和16.04官方默认更新源sources.list和第三方源推荐(干货!)
不多说,直接上干货! 写在前面:笔者由于还在学校学习,学校没有开发给Linux用的上网客户端,所以只能用在windows系统中通过安装虚拟机运行linux比较方便,但没有外网,只有学校的教育网,所以我 ...
- Beta(6/7)
鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...
- IDEA 2018.2.5最新版破解到2100年图解教程
先看下我破解后的效果图 把下载的破解补丁放在你的idea的安装目录下的bin的目录下面(如下图所示),本文示例为F:\ProgramFiles\JetBrains\IntelliJ IDEA 2018 ...
- centos官网下载地址
CentOS 7官方下载地址:https://www.centos.org/download/ 源自博友的博客:https://blog.csdn.net/yf9595/article/details ...
- css 制作菜单
代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...