对事件与委托的理解(3) 事件示例

此处介绍的示例是建立在事件和委托和引发事件中讨论的多个部分的基础上的。
本示例显示了如何从您的类引发事件以及如何处理事件。它定义了以下类。
AlarmClock 是引发 Alarm 事件的类。
AlarmEventArgs 为 Alarm 事件定义数据。
AlarmEventHandler 是 Alarm 事件的委托。
WakeMeUp 是具有 AlarmRang 方法的类,该方法处理 Alarm 事件。
AlarmDriver 是示范事件如何连结的类。该类实例化 AlarmClock 和 WakeMeUp。然后,该类通过对 WakeMeUp 实例的 AlarmRang 方法的引用实例化 AlarmEventHandler 委托。AlarmDriver 通过向 AlarmClock 的实例注册该委托并用 += 语法将委托添加到一个事件,完成事件连结。
编译和运行该示例
将以下代码复制到源文件(如 EventSample.cs 或 EventSample.vb)。
从包含源文件的目录下,执行下列命令:
[C#]
csc /r:System.dll EventSample.cs

[Visual Basic]
vbc /r:System.dll EventSample.vb
(/r 选项引用 System 程序集。)
运行创建的可执行文件 EventSample.exe。
[C#]
// EventSample.cs.
//
namespace EventSample

   using System;
   using System.ComponentModel;
  
   // Class that contains the data for
   // the alarm event. Derives from System.EventArgs.
   //
   public class AlarmEventArgs : EventArgs
   { 
      private readonly bool snoozePressed ;
      private readonly int nrings;
     
      //Constructor.
      //
      public AlarmEventArgs(bool snoozePressed, int nrings)
      {
         this.snoozePressed = snoozePressed;
         this.nrings = nrings;
      }
     
      // The NumRings property returns the number of rings
      // that the alarm clock has sounded when the alarm event
      // is generated.
      //
      public int NumRings
      {    
         get { return nrings;}     
      }
     
      // The SnoozePressed property indicates whether the snooze
      // button is pressed on the alarm when the alarm event is generated.
      //
      public bool SnoozePressed
      {
         get {return snoozePressed;}
      }
     
      // The AlarmText property that contains the wake-up message.
      //
      public string AlarmText
      {
         get
         {
            if (snoozePressed)
            {
               return ("Wake Up!!! Snooze time is over.");
            }
            else
            {
               return ("Wake Up!");
            }
         }
      } 
   }
  
   // Delegate declaration.
   //
   public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
  
   // The Alarm class that raises the alarm event.
   //
   public class AlarmClock
   { 
      private bool snoozePressed = false;
      private int nrings = 0;
      private bool stop = false;
     
      // The Stop property indicates whether the
      // alarm should be turned off.
      //
      public bool Stop
      {
         get {return stop;}
         set {stop = value;}
      }
     
      // The SnoozePressed property indicates whether the snooze
      // button is pressed on the alarm when the alarm event is generated.
      //
      public bool SnoozePressed
      {
         get {return snoozePressed;}
         set {snoozePressed = value;}
      }
   // The event member that is of type AlarmEventHandler.
      //
      public event AlarmEventHandler Alarm;

      // The protected OnAlarm method raises the event by invoking
      // the delegates. The sender is always this, the current instance
      // of the class.
      //
      protected virtual void OnAlarm(AlarmEventArgs e)
      {
         if (Alarm != null)
         {
            // Invokes the delegates.
            Alarm(this, e);
         }
      }
     
      // This alarm clock does not have
      // a user interface.
      // To simulate the alarm mechanism it has a loop
      // that raises the alarm event at every iteration
      // with a time delay of 300 milliseconds,
      // if snooze is not pressed. If snooze is pressed,
      // the time delay is 1000 milliseconds.
      //
      public void Start()
      {
         for (;;)   
         {
            nrings++;     
            if (stop)
            {
               break;
            }
           
            else if (snoozePressed)
            {
               System.Threading.Thread.Sleep(1000);
               {
                  AlarmEventArgs e = new AlarmEventArgs(snoozePressed,
                     nrings);
                  OnAlarm(e);
               }
            }
            else
            {
               System.Threading.Thread.Sleep(300);
               AlarmEventArgs e = new AlarmEventArgs(snoozePressed,
                  nrings);
               OnAlarm(e);
            }          
         }
      }
   }
  
   // The WakeMeUp class that has a method AlarmRang that handles the
   // alarm event.
   //
   public class WakeMeUp
   {
     
      public void AlarmRang(object sender, AlarmEventArgs e)
      {
        
         Console.WriteLine(e.AlarmText +"/n");
        
         if (!(e.SnoozePressed))
         {
            if (e.NumRings % 10 == 0)
            {
               Console.WriteLine(" Let alarm ring? Enter Y");
               Console.WriteLine(" Press Snooze? Enter N");
               Console.WriteLine(" Stop Alarm? Enter Q");
               String input = Console.ReadLine();
              
               if (input.Equals("Y") ||input.Equals("y")) return;
              
               else if (input.Equals("N") || input.Equals("n"))
               {
                  ((AlarmClock)sender).SnoozePressed = true;
                  return;
               }
               else
               {
                  ((AlarmClock)sender).Stop = true;
                  return;
               }
            }
         }
         else
         {
            Console.WriteLine(" Let alarm ring? Enter Y");
            Console.WriteLine(" Stop Alarm? Enter Q");
            String input = Console.ReadLine();
            if (input.Equals("Y") || input.Equals("y")) return;
            else
            {
               ((AlarmClock)sender).Stop = true;
               return;
            }
         }
      }
   }
  
  
  
   // The driver class that hooks up the event handling method of
   // WakeMeUp to the alarm event of an Alarm object using a delegate.
   // In a forms-based application, the driver class is the
   // form.
   //
   public class AlarmDriver
   { 
      public static void Main (string[] args)
      { 
         // Instantiates the event receiver.
         WakeMeUp w= new WakeMeUp();
                 
         // Instantiates the event source.
         AlarmClock clock = new AlarmClock();

         // Wires the AlarmRang method to the Alarm event.
         clock.Alarm += new AlarmEventHandler(w.AlarmRang);

         clock.Start();
      }
   }  
}
[Visual Basic]
' EventSample.vb.
'
Option Explicit
Option Strict

Imports System
Imports System.ComponentModel
Imports Microsoft.VisualBasic

Namespace EventSample
  
   ' Class that contains the data for
   ' the alarm event. Derives from System.EventArgs.
   '
   Public Class AlarmEventArgs
      Inherits EventArgs
      Private _snoozePressed As Boolean
      Private nrings As Integer
     
      'Constructor.
      '
      Public Sub New(snoozePressed As Boolean, nrings As Integer)
         Me._snoozePressed = snoozePressed
         Me.nrings = nrings
      End Sub
     
      ' The NumRings property returns the number of rings
      ' that the alarm clock has sounded when the alarm event
      ' is generated.
      '
      Public ReadOnly Property NumRings() As Integer
         Get
            Return nrings
         End Get
      End Property
     
      ' The SnoozePressed property indicates whether the snooze
      ' button is pressed on the alarm when the alarm event is generated.
      '
      Public ReadOnly Property SnoozePressed() As Boolean
         Get
            Return _snoozePressed
         End Get
      End Property
     
      ' The AlarmText property that contains the wake-up message.
      '
      Public ReadOnly Property AlarmText() As String
         Get
            If _snoozePressed Then
               Return "Wake Up!!! Snooze time is over."
            Else
               Return "Wake Up!"
            End If
         End Get
      End Property
   End Class
  
  
   ' Delegate declaration.
   '
   Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)

   ' The Alarm class that raises the alarm event.
   '
   Public Class AlarmClock
      Private _snoozePressed As Boolean = False
      Private nrings As Integer = 0
      Private stopFlag As Boolean = False
     
      ' The Stop property indicates whether the
      ' alarm should be turned off.
      '
      Public Property [Stop]() As Boolean
         Get
            Return stopFlag
         End Get
         Set
            stopFlag = value
         End Set
      End Property
     
      ' The SnoozePressed property indicates whether the snooze
      ' button is pressed on the alarm when the alarm event is generated.
      '
      Public Property SnoozePressed() As Boolean
         Get
            Return _snoozePressed
         End Get
         Set
            _snoozePressed = value
         End Set
      End Property

      ' The event member that is of type AlarmEventHandler.
      '
      Public Event Alarm As AlarmEventHandler
     
      ' The protected OnAlarm method raises the event by invoking
      ' the delegates. The sender is always this, the current instance
      ' of the class.
      '
      Protected Overridable Sub OnAlarm(e As AlarmEventArgs)
         RaiseEvent Alarm(Me, e)
      End Sub
     
     
      ' This alarm clock does not have
      ' a user interface.
      ' To simulate the alarm mechanism it has a loop
      ' that raises the alarm event at every iteration
      ' with a time delay of 300 milliseconds,
      ' if snooze is not pressed. If snooze is pressed,
      ' the time delay is 1000 milliseconds.
      '
      Public Sub Start()
         Do
            nrings += 1
            If stopFlag Then
               Exit Do
           
            Else
               If _snoozePressed Then
                  System.Threading.Thread.Sleep(1000)
                  If (True) Then
                     Dim e As New AlarmEventArgs(_snoozePressed, nrings)
                     OnAlarm(e)
                  End If
               Else
                  System.Threading.Thread.Sleep(300)
                  Dim e As New AlarmEventArgs(_snoozePressed, nrings)
                  OnAlarm(e)
               End If
            End If
         Loop
      End Sub
   End Class
 
   ' The WakeMeUp class that has a method AlarmRang that handles the
   ' alarm event.
   '
   Public Class WakeMeUp
      Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
        
         Console.WriteLine((e.AlarmText + ControlChars.Cr))
        
         If Not e.SnoozePressed Then
            If e.NumRings Mod 10 = 0 Then
               Console.WriteLine(" Let alarm ring? Enter Y")
               Console.WriteLine(" Press Snooze? Enter N")
               Console.WriteLine(" Stop Alarm? Enter Q")
               Dim input As String = Console.ReadLine()
              
               If input.Equals("Y") Or input.Equals("y") Then
                  Return
              
               Else
                  If input.Equals("N") Or input.Equals("n") Then
                     CType(sender, AlarmClock).SnoozePressed = True
                     Return
                  Else
                     CType(sender, AlarmClock).Stop = True
                     Return
                  End If
               End If
            End If
         Else
            Console.WriteLine(" Let alarm ring? Enter Y")
            Console.WriteLine(" Stop Alarm? Enter Q")
            Dim input As String = Console.ReadLine()
            If input.Equals("Y") Or input.Equals("y") Then
               Return
            Else
               CType(sender, AlarmClock).Stop = True
               Return
            End If
         End If
      End Sub
   End Class
  
   ' The driver class that hooks up the event handling method of
   ' WakeMeUp to the alarm event of an Alarm object using a delegate.
   ' In a forms-based application, the driver class is the
   ' form.
   '
   Public Class AlarmDriver
      Public Shared Sub Main()
         ' Instantiates the event receiver.
         Dim w As New WakeMeUp()
        
         ' Instantiates the event source.
         Dim clock As New AlarmClock()
        
         ' Wires the AlarmRang method to the Alarm event.
         AddHandler clock.Alarm, AddressOf w.AlarmRang
        
         clock.Start()
      End Sub
   End Class
End Namespace

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值