下面的示例程序阐释如何在一个类中引发一个事件,然后在另一个类中处理该事件。AlarmClock 类定义公共事件 Alarm,并提供引发该事件的方法。AlarmEventArgs 类派生自 EventArgs,并定义 Alarm 事件特定的数据。WakeMeUp 类定义处理 Alarm 事件的 AlarmRang 方法。AlarmDriver 类一起使用类,将使用 WakeMeUp 的 AlarmRang 方法设置为处理 AlarmClock 的 Alarm 事件。
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)
- {
- AlarmEventHandler handler = Alarm;
- if (handler != null)
- {
- // Invokes the delegates.
- handler(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 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();
- }
- }
- }
地址:http://msdn2.microsoft.com/zh-cn/library/9aackb16(VS.80).aspx
相关推荐
CTS定义了一组规则,这些规则规定了在.NET Framework中声明、使用和管理类型的机制。CTS的设计目标是确保跨语言集成、类型安全性和高性能代码执行。类库开发者在设计和实现类库时,必须遵循CTS的规则。 公共语言...
C#MSDN(软件开发帮助文档) 本文档提供了C#语言的详细帮助文档,涵盖了软件开发中常用的技术和资料。下面是从文档中提取的一些重要知识点: ...开发者可以通过本文档学习 C# 语言的使用和软件开发中的各种技术。
- **使用场景**:委托常用于事件处理和回调函数。 #### 六十二、使用委托 - **委托示例**:如何定义和使用委托。 #### 六十三、带有命名方法的委托与带有匿名方法的委托 - **命名方法**:使用已定义的方法作为委托...
包含用于定义常用值和引用数据类型、事件和事件处理程序、接口、特性和处理异常的基础类和基类。其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序环境管理以及对...
在.NET框架中,有三种不同类型的`Timer`类,它们分别是`System.Windows....根据MSDN的推荐,如果需要更高的精度,应避免使用`System.Windows.Forms.Timer`,转而使用`System.Timers.Timer`或`System.Threading.Timer`。
16. **Debugger类使用**: 可以直接在代码中使用`Debugger`类来启动调试会话、设置断点和输出信息。 17. **调试器特性(Debugger Attribute)**: 在.NET中,可以使用调试器特性标记方法、属性等,以便在调试时提供特殊...
在解决这些问题时,参考MSDN文档、博客文章和社区论坛(如StackOverflow)上的资源是非常有用的。通过仔细检查配置文件,理解每个元素的作用,以及正确配置服务和客户端,可以避免或解决大部分手动配置WCF服务时遇到...
* 浮动工具条躲开 Delphi 2009 下一处 VCL Bug 引发的失去响应的问题。 * 函数过程列表增加可拖动改变尺寸的机制。 * MSDN 专家修正不支持 MSDN Oct 2001 的问题。 * 源码模版中增加一表示当前方法名的宏。 * 代码...
- **使用伪指令**:在代码中加入看似合法但实际上无意义的指令,增加反汇编和逆向工程的难度。 - **函数重命名**:通过更改API函数名称来混淆调用,使得分析者难以识别函数的真实用途。 - **字符串混淆**:恶意软件...
- 使用 `try-catch` 结构处理可能引发异常的代码,增强程序的健壮性。 **布尔型与常量** - **布尔型**:`bool` 类型变量用于存储真或假的值。 - **常量**:使用 `const` 关键字定义,一旦初始化便不可更改。 **...
这个运算符在处理可空类型(nullable types)和可能返回null的对象引用时特别有用,能够帮助避免因null引用异常而引发的错误。 当`??`运算符的左操作数(即在其左侧的表达式)非null时,整个表达式的值就是左操作数...
若要在一个用 @ 引起来的字符串中包括一个双引号,请使用两对双引号:@ 符号的另一种用法是使用碰巧成为 C# 关键字的被引用的 (/reference) 标识符。 8, 修饰符 修饰符作用 访问修饰符 public private internal ...
7. **使用外部XML架构**:如果你的XAML文件引用了自定义控件或外部库,确保已正确导入相应的XML命名空间和架构。设计时错误可能由于缺少或不正确的引用引起。 8. **清理并重新构建项目**:简单但有效的方法,清理并...
在.NET编程环境中,使用`OleDb`数据提供者与Access数据库进行交互时,可能会遇到一些特定的语法问题,特别是当...同时,查阅MSDN或其他官方文档,了解具体数据提供者的特性和最佳实践,对于调试和解决问题至关重要。