`
zbw
  • 浏览: 46838 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

引发和使用事件(引用自MSDN)

    博客分类:
  • NET
阅读更多

下面的示例程序阐释如何在一个类中引发一个事件,然后在另一个类中处理该事件。AlarmClock 类定义公共事件 Alarm,并提供引发该事件的方法。AlarmEventArgs 类派生自 EventArgs,并定义 Alarm 事件特定的数据。WakeMeUp 类定义处理 Alarm 事件的 AlarmRang 方法。AlarmDriver 类一起使用类,将使用 WakeMeUpAlarmRang 方法设置为处理 AlarmClockAlarm 事件。

该示例程序使用事件和委托引发事件中详细说明的概念。

c# 代码
  1. // EventSample.cs.   
  2. //   
  3. namespace EventSample   
  4. {     
  5.    using System;   
  6.    using System.ComponentModel;   
  7.       
  8.    // Class that contains the data for    
  9.    // the alarm event. Derives from System.EventArgs.   
  10.    //   
  11.    public class AlarmEventArgs : EventArgs    
  12.    {     
  13.       private readonly bool snoozePressed ;   
  14.       private readonly int nrings;   
  15.          
  16.       //Constructor.   
  17.       //   
  18.       public AlarmEventArgs(bool snoozePressed, int nrings)    
  19.       {   
  20.          this.snoozePressed = snoozePressed;   
  21.          this.nrings = nrings;   
  22.       }   
  23.          
  24.       // The NumRings property returns the number of rings   
  25.       // that the alarm clock has sounded when the alarm event    
  26.       // is generated.   
  27.       //   
  28.       public int NumRings   
  29.       {        
  30.          get { return nrings;}         
  31.       }   
  32.          
  33.       // The SnoozePressed property indicates whether the snooze   
  34.       // button is pressed on the alarm when the alarm event is generated.   
  35.       //   
  36.       public bool SnoozePressed    
  37.       {   
  38.          get {return snoozePressed;}   
  39.       }   
  40.          
  41.       // The AlarmText property that contains the wake-up message.   
  42.       //   
  43.       public string AlarmText    
  44.       {   
  45.          get    
  46.          {   
  47.             if (snoozePressed)   
  48.             {   
  49.                return ("Wake Up!!! Snooze time is over.");   
  50.             }   
  51.             else    
  52.             {   
  53.                return ("Wake Up!");   
  54.             }   
  55.          }   
  56.       }     
  57.    }   
  58.       
  59.    // Delegate declaration.   
  60.    //   
  61.    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);   
  62.       
  63.    // The Alarm class that raises the alarm event.   
  64.    //   
  65.    public class AlarmClock    
  66.    {     
  67.       private bool snoozePressed = false;   
  68.       private int nrings = 0;   
  69.       private bool stop = false;   
  70.          
  71.       // The Stop property indicates whether the    
  72.       // alarm should be turned off.   
  73.       //   
  74.       public bool Stop    
  75.       {   
  76.          get {return stop;}   
  77.          set {stop = value;}   
  78.       }   
  79.          
  80.       // The SnoozePressed property indicates whether the snooze   
  81.       // button is pressed on the alarm when the alarm event is generated.   
  82.       //   
  83.       public bool SnoozePressed   
  84.       {   
  85.          get {return snoozePressed;}   
  86.          set {snoozePressed = value;}   
  87.       }   
  88.       // The event member that is of type AlarmEventHandler.   
  89.       //   
  90.       public event AlarmEventHandler Alarm;   
  91.   
  92.       // The protected OnAlarm method raises the event by invoking    
  93.       // the delegates. The sender is always this, the current instance    
  94.       // of the class.   
  95.       //   
  96.       protected virtual void OnAlarm(AlarmEventArgs e)   
  97.       {   
  98.         AlarmEventHandler handler = Alarm;    
  99.         if (handler != null)    
  100.         {    
  101.            // Invokes the delegates.    
  102.            handler(this, e);    
  103.         }   
  104.       }   
  105.          
  106.       // This alarm clock does not have   
  107.       // a user interface.    
  108.       // To simulate the alarm mechanism it has a loop   
  109.       // that raises the alarm event at every iteration   
  110.       // with a time delay of 300 milliseconds,   
  111.       // if snooze is not pressed. If snooze is pressed,   
  112.       // the time delay is 1000 milliseconds.   
  113.       //   
  114.       public void Start()   
  115.       {   
  116.          for (;;)       
  117.          {   
  118.             nrings++;         
  119.             if (stop)   
  120.             {   
  121.                break;   
  122.             }   
  123.                
  124.             else if (snoozePressed)   
  125.             {   
  126.                System.Threading.Thread.Sleep(1000);   
  127.                {   
  128.                   AlarmEventArgs e = new AlarmEventArgs(snoozePressed,    
  129.                      nrings);   
  130.                   OnAlarm(e);   
  131.                }   
  132.             }   
  133.             else  
  134.             {   
  135.                System.Threading.Thread.Sleep(300);   
  136.                AlarmEventArgs e = new AlarmEventArgs(snoozePressed,    
  137.                   nrings);   
  138.                OnAlarm(e);   
  139.             }              
  140.          }   
  141.       }   
  142.    }   
  143.       
  144.    // The WakeMeUp class has a method AlarmRang that handles the   
  145.    // alarm event.   
  146.    //   
  147.    public class WakeMeUp   
  148.    {   
  149.          
  150.       public void AlarmRang(object sender, AlarmEventArgs e)   
  151.       {   
  152.             
  153.          Console.WriteLine(e.AlarmText +"\n");   
  154.             
  155.          if (!(e.SnoozePressed))   
  156.          {   
  157.             if (e.NumRings % 10 == 0)   
  158.             {   
  159.                Console.WriteLine(" Let alarm ring? Enter Y");   
  160.                Console.WriteLine(" Press Snooze? Enter N");    
  161.                Console.WriteLine(" Stop Alarm? Enter Q");   
  162.                String input = Console.ReadLine();   
  163.                   
  164.                if (input.Equals("Y") ||input.Equals("y")) return;   
  165.                   
  166.                else if (input.Equals("N") || input.Equals("n"))   
  167.                {   
  168.                   ((AlarmClock)sender).SnoozePressed = true;   
  169.                   return;   
  170.                }   
  171.                else  
  172.                {   
  173.                   ((AlarmClock)sender).Stop = true;   
  174.                   return;   
  175.                }   
  176.             }   
  177.          }   
  178.          else  
  179.          {   
  180.             Console.WriteLine(" Let alarm ring? Enter Y");    
  181.             Console.WriteLine(" Stop Alarm? Enter Q");   
  182.             String input = Console.ReadLine();   
  183.             if (input.Equals("Y") || input.Equals("y")) return;   
  184.             else    
  185.             {   
  186.                ((AlarmClock)sender).Stop = true;   
  187.                return;   
  188.             }   
  189.          }   
  190.       }   
  191.    }   
  192.       
  193.       
  194.    // The driver class that hooks up the event handling method of   
  195.    // WakeMeUp to the alarm event of an Alarm object using a delegate.   
  196.    // In a forms-based application, the driver class is the   
  197.    // form.   
  198.    //   
  199.    public class AlarmDriver   
  200.    {     
  201.       public static void Main (string[] args)   
  202.       {     
  203.          // Instantiates the event receiver.   
  204.          WakeMeUp w= new WakeMeUp();   
  205.                      
  206.          // Instantiates the event source.   
  207.          AlarmClock clock = new AlarmClock();   
  208.   
  209.          // Wires the AlarmRang method to the Alarm event.   
  210.          clock.Alarm += new AlarmEventHandler(w.AlarmRang);   
  211.   
  212.          clock.Start();   
  213.       }   
  214.    }      
  215. }  

地址:http://msdn2.microsoft.com/zh-cn/library/9aackb16(VS.80).aspx

分享到:
评论

相关推荐

    MSDN类库开发人员设计指南

    CTS定义了一组规则,这些规则规定了在.NET Framework中声明、使用和管理类型的机制。CTS的设计目标是确保跨语言集成、类型安全性和高性能代码执行。类库开发者在设计和实现类库时,必须遵循CTS的规则。 公共语言...

    C#MSDN(软件开发帮助文档).pdf

    C#MSDN(软件开发帮助文档) 本文档提供了C#语言的详细帮助文档,涵盖了软件开发中常用的技术和资料。下面是从文档中提取的一些重要知识点: ...开发者可以通过本文档学习 C# 语言的使用和软件开发中的各种技术。

    MSDN_C#编程指南

    - **使用场景**:委托常用于事件处理和回调函数。 #### 六十二、使用委托 - **委托示例**:如何定义和使用委托。 #### 六十三、带有命名方法的委托与带有匿名方法的委托 - **命名方法**:使用已定义的方法作为委托...

    .NET Framework 4.0 常用类库参考手册 [微软官方 MSDN]

    包含用于定义常用值和引用数据类型、事件和事件处理程序、接口、特性和处理异常的基础类和基类。其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序环境管理以及对...

    不同类型的Timer的区别

    在.NET框架中,有三种不同类型的`Timer`类,它们分别是`System.Windows....根据MSDN的推荐,如果需要更高的精度,应避免使用`System.Windows.Forms.Timer`,转而使用`System.Timers.Timer`或`System.Threading.Timer`。

    VS 调式和异常处理教程

    16. **Debugger类使用**: 可以直接在代码中使用`Debugger`类来启动调试会话、设置断点和输出信息。 17. **调试器特性(Debugger Attribute)**: 在.NET中,可以使用调试器特性标记方法、属性等,以便在调试时提供特殊...

    手动配置WCF宿主的.config文件遇到的几种错误1

    在解决这些问题时,参考MSDN文档、博客文章和社区论坛(如StackOverflow)上的资源是非常有用的。通过仔细检查配置文件,理解每个元素的作用,以及正确配置服务和客户端,可以避免或解决大部分手动配置WCF服务时遇到...

    CnWizards V0.9.0.470

    * 浮动工具条躲开 Delphi 2009 下一处 VCL Bug 引发的失去响应的问题。 * 函数过程列表增加可拖动改变尺寸的机制。 * MSDN 专家修正不支持 MSDN Oct 2001 的问题。 * 源码模版中增加一表示当前方法名的宏。 * 代码...

    A Museum of API Obfuscation on Win32

    - **使用伪指令**:在代码中加入看似合法但实际上无意义的指令,增加反汇编和逆向工程的难度。 - **函数重命名**:通过更改API函数名称来混淆调用,使得分析者难以识别函数的真实用途。 - **字符串混淆**:恶意软件...

    C#学习笔记

    - 使用 `try-catch` 结构处理可能引发异常的代码,增强程序的健壮性。 **布尔型与常量** - **布尔型**:`bool` 类型变量用于存储真或假的值。 - **常量**:使用 `const` 关键字定义,一旦初始化便不可更改。 **...

    C# null 合并运算符??(双问号)使用示例

    这个运算符在处理可空类型(nullable types)和可能返回null的对象引用时特别有用,能够帮助避免因null引用异常而引发的错误。 当`??`运算符的左操作数(即在其左侧的表达式)非null时,整个表达式的值就是左操作数...

    c#学习笔记.txt

    若要在一个用 @ 引起来的字符串中包括一个双引号,请使用两对双引号:@ 符号的另一种用法是使用碰巧成为 C# 关键字的被引用的 (/reference) 标识符。 8, 修饰符 修饰符作用 访问修饰符 public private internal ...

    如何调试WPF XAML文件中的设计时错误?

    7. **使用外部XML架构**:如果你的XAML文件引用了自定义控件或外部库,确保已正确导入相应的XML命名空间和架构。设计时错误可能由于缺少或不正确的引用引起。 8. **清理并重新构建项目**:简单但有效的方法,清理并...

    net insert into语法错误详解

    在.NET编程环境中,使用`OleDb`数据提供者与Access数据库进行交互时,可能会遇到一些特定的语法问题,特别是当...同时,查阅MSDN或其他官方文档,了解具体数据提供者的特性和最佳实践,对于调试和解决问题至关重要。

Global site tag (gtag.js) - Google Analytics