链接地址: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. JQuery隔行变色

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  2. java中printf中用法详解

    目前printf支持以下格式: %c 单个字符 %d 十进制整数 %f 十进制浮点数 %o 八进制数 %s 字符串 %u 无符号十进制数 %x 十六进制数 %% 输出百分号% printf的格式控制的 ...

  3. python笔记之列表与元组函数和方法使用举例

    在学习列表之前先了解了raw_input和input的区别:(仅适用于版本2,版本3中raw_input和input合并,没有raw_input) input的语法为:input("str& ...

  4. 软件源(Software Sources)

    写在前面:浏览了很多国内外的网站,看了很多关于软件源(Software Sources)设置的文章,发现有很多文章中对软件源的设置存在误解,为了让新人能顺利进入Ubuntu的大家庭,特地作此文,详细地 ...

  5. (Problem 36)Double-base palindromes

    The decimal number, 585 = 10010010012(binary), is palindromic in both bases. Find the sum of all num ...

  6. Code 49 码

    Code 49码是一种多层.连续型.可变长度的条码符号,它可以表示全部的128个ASCII字符.每个Code 49条码符号由2到8层组成,每层有18个条和17个空.层与层之间由一个层分隔条分开.每层包 ...

  7. QT绘制半透明窗体(改写paintEvent,超级简单)

    在派生类中重载QDialog的void paintEvent(QPaintEvent *)事件,在这个函数中加入以下代码 QPainter painter(this);    QLinearGradi ...

  8. asp.net判断用户是否登录

    最简单的代码: if(Session["LoginUser"] == null)  //注意:Session["LoginUser"]后面,没有ToString ...

  9. (3)选择元素——(2)文档对象模型(The Document Object Model)

    One of the most powerful aspects of jQuery is its ability to make selecting elements in the DOM easy ...

  10. Unity Notes调制粒子系统的颗粒的最大数目

    Unity该粒子系统是很容易使用.这样的问题是在实际的过程中遇到的:以控制的粒子系统组件的动态需要可产生颗粒的最大数目. 看doc他说,有maxParticles控制.却没有这个开放的參数.仅仅能通过 ...