Events基本概念----Beginning Visual C#
span.kw { color: #007020; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #40a070; }
code > span.fl { color: #40a070; }
code > span.ch { color: #4070a0; }
code > span.st { color: #4070a0; }
code > span.co { color: #60a0b0; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #06287e; }
code > span.er { color: #ff0000; font-weight: bold; }
-->
一个事件的发生需要有触发条件,如定时发生,鼠标点击等,以及即将发生的事件本身,因此,events相关的最简单的示例如下:
// 时间触发器
class TimerTrigger
{
private Timer myTimer;
public TimerTrigger()
{
myTimer = new Timer(100);
}
public TimerTrigger(int timeInterval)
{
myTimer = new Timer(timeInterval);
}
// 向时间触发器添加具事件的handler
public void AddEventHander(ElapsedEventHandler source)
{
myTimer.Elapsed += source;
}
public void Start()
{
myTimer.Start();
}
public void Stop()
{
myTimer.Stop();
}
}
class Program
{
static int counter = 0;
static string displayString =
"This string will appear one letter at a time. ";
// 即将被添加到时间触发器的事件
static void WriteChar(object source, ElapsedEventArgs e)
{
Console.Write(displayString[counter++ % displayString.Length]);
}
public static void Main()
{
TimerTrigger timerTrigger = new TimerTrigger(100);
timerTrigger.AddEventHander(new ElapsedEventHandler(WriteChar));
timerTrigger.Start();
Console.ReadLine();
}
}
在上面的例子的main函数中,直接使用了c#自带的ElapsedEventHandler delegated类型,那么如何自定义事件处理函数呢?具体如下:
// 自定义时间处理代表
public delegate void MessageHandler(string message);
class TimerTrigger
{
private Timer myTimer;
private event MessageHandler MessageArrived;
public TimerTrigger(int timeInterval)
{
myTimer = new Timer(timeInterval);
myTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
}
public void AddEventHandler(MessageHandler source)
{
MessageArrived += source;
}
public void Start()
{
myTimer.Start();
}
public void Stop()
{
myTimer.Stop();
}
private void CheckForMessage(object source, ElapsedEventArgs e)
{
Console.WriteLine("Checking for new messages.");
if (MessageArrived != null)
{
MessageArrived("hello world");
}
}
}
class Program
{
static int counter = 0;
static void WriteFirstMessage(string message)
{
Console.WriteLine("The First {0} number: {1}", message, counter++);
}
static void WriteSecondMessage(string message)
{
Console.WriteLine("The Second {0} number: {1}", message, counter++);
}
public static void Main()
{
TimerTrigger timerTrigger = new TimerTrigger(100);
timerTrigger.AddEventHandler(new MessageHandler(WriteFirstMessage));
timerTrigger.AddEventHandler(new MessageHandler(WriteSecondMessage));
timerTrigger.Start();
Console.ReadLine();
}
}
在上述的例子中,将消息传递给处理事件所用的函数为WriteFirstMessage(string message),其传递的参数为string类型的。再考虑道<Timer>.ElapsedEventHandler所代表的函数的传递参数为:(object source, ElapsedEventArgs e)两个参数,那么我们能否实现类似的形式呢?这是可以的,如下:
public class MessageArrivedEventArgs : EventArgs
{
private string message;
public string Message
{
get
{
return message;
}
}
public MessageArrivedEventArgs()
{
message = "No message sent.";
}
public MessageArrivedEventArgs(string newMessage)
{
message = newMessage;
}
}
public delegate void MessageHandler(TimerTrigger source,
MessageArrivedEventArgs e);
public class TimerTrigger
{
private Timer myTimer;
private event MessageHandler MessageArrived;
public TimerTrigger(int timeInterval)
{
myTimer = new Timer(timeInterval);
myTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
}
public void AddEventHandler(MessageHandler source)
{
MessageArrived += source;
}
public void Start()
{
myTimer.Start();
}
public void Stop()
{
myTimer.Stop();
}
private void CheckForMessage(object source, ElapsedEventArgs e)
{
Console.WriteLine("Checking for new messages.");
if (MessageArrived != null)
{
MessageArrived(this, new MessageArrivedEventArgs("hello world"));
}
}
}
class Program
{
static int counter = 0;
static void WriteFirstMessage(TimerTrigger source, MessageArrivedEventArgs e)
{
Console.WriteLine("The First {0} number: {1}", e.Message, counter++);
}
static void WriteSecondMessage(TimerTrigger source, MessageArrivedEventArgs e)
{
Console.WriteLine("The Second {0} number: {1}", e.Message, counter++);
}
public static void Main()
{
TimerTrigger timerTrigger = new TimerTrigger(100);
timerTrigger.AddEventHandler(new MessageHandler(WriteFirstMessage));
timerTrigger.AddEventHandler(new MessageHandler(WriteSecondMessage));
timerTrigger.Start();
Console.ReadLine();
}
}
Events基本概念----Beginning Visual C#的更多相关文章
- 与类相关基本概念----Beginning Visual C#
span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...
- 基本概念----Beginning Visual C#
更多相关文章,见本人的个人主页:zhongxiewei.com 变量 注释方式:// 注释在这里和/* 注释在这里 */ 整形变量的类型: Type Alias for Allowed Values ...
- Windows Programming ---- Beginning Visual C#
span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...
- 函数----Beginning Visual C#
span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...
- visual formatting model (可视化格式模型)【持续修正】
概念: visual formatting model,可视化格式模型 The CSS visual formatting model is an algorithm that processes a ...
- Visual Studio 2015官方汇总包括下载和视频
7月20日 23:30 Visual Studio 2015正式版正式发布,作为微软新一代开发利器,在全地球乃至全宇宙乃至全太阳系中最强大 且没有之一的IDE(上述描述来自微博用户评论)跨平台支持成 ...
- 用于 Visual Studio 和 ASP.NET 的 Web 应用程序项目部署常见问题
https://msdn.microsoft.com/zh-cn/library/ee942158(v=vs.110).aspx#can_i_exclude_specific_files_or_fol ...
- Visual Studio 2012 开发环境配置+控制台工具+桌面应用程序
一.界面布局视图设置 1.窗口的布局.控制台窗口运行恢复到开发环境的设置方法 也可以保存好设好的个性化设置,导入设置: 2.视图|服务器资源管理器(sever explorer) 可以访问数据源.服务 ...
- Visual Basic了解
Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...
随机推荐
- 发布:.NET开发人员必备的可视化调试工具(你值的拥有)
1:如何使用 1:点击下载:.NET可视化调试工具 (更新于2016-12-29 19:11:00) (终于彻底兼容了部分VS环境下无法使用的问题) 2:解压RAR后执行:CYQ.VisualierS ...
- .net core快速上手
2014年11月12日的Connect ();开发者活动上宣布将.NET堆栈基于MIT协议开源,并且提供开源保证,托管在Github上.当时的版本与最终目标相距甚远,然而有一点可以肯定的是,这是一个与 ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- ExtJS 4.2 组件的查找方式
组件创建了,就有方法找到这些组件.在DOM.Jquery都有各自的方法查找元素/组件,ExtJS也有自己独特的方式查找组件.元素.本次从全局查找.容器内查找.form表单查找.通用组件等4个方面介绍组 ...
- 6. ModelDriven拦截器、Preparable 拦截器
1. 问题 Struts2 的 Action 我们将它定义为一个控制器,但是由于在 Action 中也可以来编写一些业务逻辑,也有人会在 Action 输入业务逻辑层. 但是在企业开发中,我们一般会将 ...
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- [原] Cgroup CPU, Blkio 测试
关于Cgroup的简单测试 [toc] 简单介绍Cgroup (如果对cgroup熟悉可以忽略) 一般情况下,cgroup挂载到一个虚拟文件目录,然后可以通过文件系统的API对其操作. ># m ...
- c# 基础 object ,new操作符,类型转换
参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...
- “RazorEngine.Templating.TemplateParsingException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理 其他信息: Expected model identifier.
这个问题是由于在cshtml中 引用了model这个单词 它可能和Model在解析时有冲突. 解决方法:把model换成别的单词就可以了.
- 微信小程序体验(1):携程酒店机票火车票
在 12 月 28 日微信公开课上,张小龙对微信小程序的形态进行了阐释,小程序有四个特定:无需安装.触手可及.用完即走.无需卸载. 由于携程这种订酒店.火车票和机票等工具性质非常强的服务,非常符合张小 ...