• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#的事件处理机制

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

链接地址: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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#制作ActiveX控件中调用海康SDK的问题发布时间:2022-07-13
下一篇:
C#解决字符串中空格的八大方法.发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap