zoukankan      html  css  js  c++  java
  • C#的事件处理机制

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

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

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

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

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

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

    事件的发布者:

    [csharp] view plaincopy
     
    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. }  

    事件的接收者:

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


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

    [csharp] view plaincopy
     
    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#事件处理。

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


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

    如果一件事情你觉得难的完不成,你可以把它分为若干步,并不断寻找合适的方法。最后你发现你会是个超人。不要给自己找麻烦,但遇到麻烦绝不怕,更不要退缩。 电工查找电路不通点的最快方法是:分段诊断排除,快速定位。你有什么启示吗? 求知若饥,虚心若愚。 当你对一个事情掌控不足的时候,你需要做的就是“梳理”,并制定相应的规章制度,并使资源各司其职。
  • 相关阅读:
    python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
    JVM内存模型、指令重排、内存屏障概念解析
    图解JVM的Class文件格式(详细版)
    图解JVM执行引擎之方法调用
    为何JAVA虚函数(虚方法)会造成父类可以"访问"子类的假象?
    小乖上学第一天
    FLEX RIA快速添加图标
    1,2,3,5,7,8,10,11,12,13,14,15,16,21,22 》1~3,5,7~8,10~16,21~22
    ABAP 函数编写
    ABAP子进程(字符串分割定位)
  • 原文地址:https://www.cnblogs.com/wvqusrtg/p/4874084.html
Copyright © 2011-2022 走看看