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#的更多相关文章

  1. 与类相关基本概念----Beginning Visual C#

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  2. 基本概念----Beginning Visual C#

    更多相关文章,见本人的个人主页:zhongxiewei.com 变量 注释方式:// 注释在这里和/* 注释在这里 */ 整形变量的类型: Type Alias for Allowed Values ...

  3. Windows Programming ---- Beginning Visual C#

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  4. 函数----Beginning Visual C#

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  5. visual formatting model (可视化格式模型)【持续修正】

    概念: visual formatting model,可视化格式模型 The CSS visual formatting model is an algorithm that processes a ...

  6. Visual Studio 2015官方汇总包括下载和视频

     7月20日 23:30 Visual Studio 2015正式版正式发布,作为微软新一代开发利器,在全地球乃至全宇宙乃至全太阳系中最强大 且没有之一的IDE(上述描述来自微博用户评论)跨平台支持成 ...

  7. 用于 Visual Studio 和 ASP.NET 的 Web 应用程序项目部署常见问题

    https://msdn.microsoft.com/zh-cn/library/ee942158(v=vs.110).aspx#can_i_exclude_specific_files_or_fol ...

  8. Visual Studio 2012 开发环境配置+控制台工具+桌面应用程序

    一.界面布局视图设置 1.窗口的布局.控制台窗口运行恢复到开发环境的设置方法 也可以保存好设好的个性化设置,导入设置: 2.视图|服务器资源管理器(sever explorer) 可以访问数据源.服务 ...

  9. Visual Basic了解

    Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...

随机推荐

  1. sonn_game网站开发01:写在最前面

    之前做的个人博客项目,日向博客现在已经进入后期完善阶段了.是时候开始打造一个新坑了. 然而改造个什么坑呢?构思了好几天,想了好多方案,都觉得没啥动手欲望.因为,我想做的是那种,自己能用得上,而且有一定 ...

  2. Linux CentOS 配置JDK环境

    一.下载JDK 下载JDK的方式有两种: 1.Linux中使用wget下载 1.使用命令安装wget yum install wget 2.下载 wget 'http://download.oracl ...

  3. 1.初始Windows Server 2012 R2 Hyper-V + 系统安装详细

    干啥的?现在企业服务器都是分开的,比如图片服务器,数据库服务器,redis服务器等等,或多或少一个网站都会用到多个服务器,而服务器的成本很高,要是动不动采购几十台,公司绝对吃不消的,于是虚拟化技术出来 ...

  4. 关于VS2015 ASP.NET MVC添加控制器的时候报错

    调试环境:VS2015 数据库Mysql  WIN10 在调试过程中出现类似下两图的同学们,注意啦. 其实也是在学习的过程中遇到这个问题的,找了很多资料都没有正面的解决添加控制器的时候报错的问题,还是 ...

  5. 【Big Data】HADOOP集群的配置(一)

    Hadoop集群的配置(一) 摘要: hadoop集群配置系列文档,是笔者在实验室真机环境实验后整理而得.以便随后工作所需,做以知识整理,另则与博客园朋友分享实验成果,因为笔者在学习初期,也遇到不少问 ...

  6. 简历生成平台项目开发-STEP1问卷设计

    周五课程结束完后,小组建立QQ群和微信群,着手讨论项目问题.一开始的大概想法:就业信息平台,收集企业招聘信息和就业生资料,提供给学生和企业的校企对接平台.后来发现群里谭卓同学也有个相关的思路,经过商量 ...

  7. (转载) RESTful API 设计指南

    作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制 ...

  8. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  9. 分享一款自己改进的皮肤“verdant”.

    - -!我总觉得我不应该这个样子了,这是个不好的习惯,面对博客,我每周或者每个月都会有审美疲劳,然后又写一个皮肤模板,不停的循环,至今都写了好多好多了,都记不清了,汗... 下面是我这今天审美疲劳写的 ...

  10. test

    http://img.ivsky.com/img/bizhi/pic/201009/07/fangaoyouhua-015.jpghttp://desk.fd.zol-img.com.cn/t_s16 ...