链接地址:http://blog.csdn.net/niuox/article/details/7527876

在以往的关于事件处理的程序中,我们更多的是采用一种循环等待的方式,即为了检测某个事件是否发生,循环的检测某个变量是否发生变化但这样会占用大量的资源。而C#   的事件处理机制提供了一种非常好的解决方案。程序不再不停的检查设备,而是等待消息的到来,然后交给程序来处理他它。这样的话,操作系统中只是傻瓜式的将消息传递给对象,由对象的事件驱动程序确定该怎么做。

我们先来介绍一下什么是事件:

事件就是一种消息通知,它是对象之间传递消息的一种方式。事件是类的一种成员。使用Event声明事件。C#采用一种称作:“发布”-“登记”-“接受”的逻辑来在对象之间传 递消息,通知某个事件的发生。

接着,我们要来介绍一下什么是事件的委托,简单的说,委托就是一种面向对象的安全的函数指针。具体点:我们定义了两个类,一个用来发布事件,一个用来接收事件,但是发送方如何知道那个接收方将接受这个消息呢。这样的话,我们就需要在这两者之间创造一种媒介,这个媒介就是委托。

接着。我们来用代码的形式研究一下:

事件的发布者:

  1. public class SomeSenderClass
  2. {
  3. //事件声明
  4. public event SomeEventHandler SomeEvent;
  5. //通知事件登记对象
  6. protected virtual void OnSomeEvent(SomeEventArgs e)
  7. {
  8. if (SomeEvent != null)
  9. SomeEvent(this, e);
  10. }
  11. //模拟事件
  12. public void SomeTiggerMethod()
  13. {
  14. //实例化事件参数
  15. SomeEventArgs e = new SomeEventArgs();
  16. //触发事件
  17. OnSomeEvent(e);
  18. }
  19. }

事件的接收者:

  1. public class SomeReceiverClass
  2. {
  3. public void SomeEventProcessMethod(
  4. object sender, SomeEventArgs e)
  5. {
  6. Console.WriteLine("响应SomeEvent事件");
  7. }
  8. }

登记和触发事件代码的形式:

  1. public class SomeApp {
  2. public static Main(string[] args) {
  3. //实例化事件接受者
  4. SomeReceiverClass myReceiver = new SomeReceiverClass();
  5. //实例化事件发送者
  6. SomeSenderClass mySender = new SomeSenderClass ();
  7. //登记事件
  8. mySender.SomeEvent += new
  9. SomeEventHandler( myReceiver.SomeEventProcessMethod);
  10. }
  11. }

这样我们基本理解了C#事件处理的流程。

附上一个写的较好的处理按键事件处理的程序,来帮助我们理解C#事件处理。

  1. using System;
  2. internal class KeyEventArgs : EventArgs
  3. {
  4. private char keyChar;
  5. public KeyEventArgs(char keyChar)
  6. : base()
  7. {
  8. this.keyChar = keyChar;
  9. }
  10. public char KeyChar
  11. {
  12. get
  13. {
  14. return keyChar;
  15. }
  16. }
  17. }
  18. internal class KeyInputMonitor
  19. {
  20. // 创建一个委托,返回类型为void,两个参数
  21. public delegate void KeyDownHandler(object sender, KeyEventArgs e);
  22. // 将创建的委托和特定事件关联,在这里特定的事件为KeyDown
  23. public event KeyDownHandler KeyDown;
  24. public void Run()
  25. {
  26. bool finished = false;
  27. do
  28. {
  29. Console.WriteLine("Input a char");
  30. string response = Console.ReadLine();
  31. char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
  32. // 得到按键信息的参数
  33. KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
  34. // 触发事件
  35. KeyDown(this, keyEventArgs);
  36. } while (!finished);
  37. }
  38. }
  39. internal class EventReceiver
  40. {
  41. public EventReceiver(KeyInputMonitor monitor)
  42. {
  43. // 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
  44. monitor.KeyDown += new KeyInputMonitor.KeyDownHandler(this.OnKeyDown);
  45. }
  46. private void OnKeyDown(object sender, KeyEventArgs e)
  47. {
  48. // 真正的事件处理函数
  49. Console.WriteLine("Capture key: {0}", e.KeyChar);
  50. }
  51. }
  52. public class MainEntryPoint
  53. {
  54. public static void Main(string[] args)
  55. {
  56. // 实例化一个事件发送器
  57. KeyInputMonitor monitor = new KeyInputMonitor();
  58. // 实例化一个事件接收器
  59. EventReceiver eventReceiver = new EventReceiver(monitor);
  60. // 运行
  61. monitor.Run();
  62. }
  63. }

参考自:http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html

C#的事件处理机制的更多相关文章

  1. java 事件处理机制:按下上下左右键控制小球的运动

    /** * 加深对事件处理机制的理解 * 通过上下左右键来控制一个小球的位置 */package com.test3;import java.awt.*;import javax.swing.*;im ...

  2. Android事件处理机制

    包括监听和回调两种机制. 1. 基于监听的事件处理: 事件监听包含三类对象,事件源,事件,事件监听器.Android的事件处理机制是一种委派式(Delegation)事件处理方式:普通组件(事件源)将 ...

  3. Android的两种事件处理机制

    UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理. 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事 ...

  4. Android的Touch事件处理机制

    Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一 ...

  5. IOS事件处理机制(关于触发者和响应者的确认)

    事件处理机制 在iOS中发生触摸后,事件会加入到UIApplication事件队列(在这个系列关于iOS开发的第一篇文章中我们分析iOS程序原理的时候就说过程序运行后UIApplication会循环监 ...

  6. Java Swing事件处理机制

    Java Swing的事件处理机制 Swing GUI启动后,Java虚拟机就启动三个线程,分别为主线程,事件派发线程(也是事件处理线程)和系统工具包线程. 主线程 :负责创建并显示该程序的初始界面: ...

  7. Qt事件处理机制

    研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...

  8. core java 8~9(GUI & AWT事件处理机制)

    MODULE 8 GUIs--------------------------------GUI中的包: java.awt.*; javax.swing.*; java.awt.event.*; 要求 ...

  9. Android的事件处理机制详解(二)-----基于监听的事件处理机制

    基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制 ...

  10. Android的事件处理机制(一)------基于回调机制的事件处理

    Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...

随机推荐

  1. 定制一个winCE5.0操作系统

    定制一个winCE5.0操作系统 2009-04-01 09:01:14|  分类: winCE|字号 订阅     定制一个操作系统并模拟器上运行,需要以下几个步骤: STEP 1:用Platfor ...

  2. linux下的压缩解压命令 tar 的简单描述

    命令名称:tar 命令所在路径:/bin/tar 语法:tar选项·「-zcf」·「压缩后文件名」「目录」 -c 打包 -v 显示详细信息 -f 指定文件名 -z 打包同时压缩 tar命令解压缩语法: ...

  3. POJ-1003&1004

    这两题比较简单,就不做分析了,描述下题目,就上代码吧. [题目描述] 1003,其实就是求这个方程的最小n:1/2 + 1/3 + 1/4 + ... + 1/(n + 1) >= c: 100 ...

  4. 一旦配置oracle em经验

    对oracle10grac构造em,原本很easy事儿,但它需要一个很长的时间,记录下来.MEMO. 首先,例如,报告了以下错误: [oracle@node1 admin]$ emca -config ...

  5. IOS-图片操作集合

    编辑图片的几个方法 第一种 先用UIImage对象加载一张图片 然后转化成CGImageRef放到CGContext中去编辑 第二种  用CGImageCreate函数创建CGImageRef 然后把 ...

  6. IBATIS动态SQL

    转自:http://www.cnblogs.com/phoebus0501/archive/2011/05/16/2048126.html 直接使用JDBC一个非常普遍的问题就是动态SQL.使用参数值 ...

  7. 在vmware里面免费安装纯净的xp虚拟机

    1. 安装vmware, 略 2. 下载xp http://msdn.itellyou.cn/ 用迅雷下载Windows XP Professional with Service Pack 3 (x8 ...

  8. BZOJ 3236: [Ahoi2013]作业( 莫队 + BIT )

    莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ----------------------------------------------- ...

  9. C++拾遗

    1三个概念 字符串字面值是一串常量字符(是一个常量),字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符.字符串字面值的类型 ...

  10. 兼容性问题( css)

    记录平时遇见的兼容性问题,有更好的解决办法希望各位提出,会持续更新 提出时间 问题描述 解决方案 2014/7/15 table下面使用img或者其他元素例如embed会产生,对应的空隙,假如使用文字 ...