C#的事件处理机制
链接地址:http://blog.csdn.net/niuox/article/details/7527876
在以往的关于事件处理的程序中,我们更多的是采用一种循环等待的方式,即为了检测某个事件是否发生,循环的检测某个变量是否发生变化但这样会占用大量的资源。而C# 的事件处理机制提供了一种非常好的解决方案。程序不再不停的检查设备,而是等待消息的到来,然后交给程序来处理他它。这样的话,操作系统中只是傻瓜式的将消息传递给对象,由对象的事件驱动程序确定该怎么做。
我们先来介绍一下什么是事件:
事件就是一种消息通知,它是对象之间传递消息的一种方式。事件是类的一种成员。使用Event声明事件。C#采用一种称作:“发布”-“登记”-“接受”的逻辑来在对象之间传 递消息,通知某个事件的发生。
接着,我们要来介绍一下什么是事件的委托,简单的说,委托就是一种面向对象的安全的函数指针。具体点:我们定义了两个类,一个用来发布事件,一个用来接收事件,但是发送方如何知道那个接收方将接受这个消息呢。这样的话,我们就需要在这两者之间创造一种媒介,这个媒介就是委托。
接着。我们来用代码的形式研究一下:
事件的发布者:
- public class SomeSenderClass
- {
- //事件声明
- public event SomeEventHandler SomeEvent;
- //通知事件登记对象
- protected virtual void OnSomeEvent(SomeEventArgs e)
- {
- if (SomeEvent != null)
- SomeEvent(this, e);
- }
- //模拟事件
- public void SomeTiggerMethod()
- {
- //实例化事件参数
- SomeEventArgs e = new SomeEventArgs();
- //触发事件
- OnSomeEvent(e);
- }
- }
事件的接收者:
- public class SomeReceiverClass
- {
- public void SomeEventProcessMethod(
- object sender, SomeEventArgs e)
- {
- Console.WriteLine("响应SomeEvent事件");
- }
- }
登记和触发事件代码的形式:
- public class SomeApp {
- public static Main(string[] args) {
- //实例化事件接受者
- SomeReceiverClass myReceiver = new SomeReceiverClass();
- //实例化事件发送者
- SomeSenderClass mySender = new SomeSenderClass ();
- //登记事件
- mySender.SomeEvent += new
- SomeEventHandler( myReceiver.SomeEventProcessMethod);
- }
- }
这样我们基本理解了C#事件处理的流程。
附上一个写的较好的处理按键事件处理的程序,来帮助我们理解C#事件处理。
- using System;
- internal class KeyEventArgs : EventArgs
- {
- private char keyChar;
- public KeyEventArgs(char keyChar)
- : base()
- {
- this.keyChar = keyChar;
- }
- public char KeyChar
- {
- get
- {
- return keyChar;
- }
- }
- }
- internal class KeyInputMonitor
- {
- // 创建一个委托,返回类型为void,两个参数
- public delegate void KeyDownHandler(object sender, KeyEventArgs e);
- // 将创建的委托和特定事件关联,在这里特定的事件为KeyDown
- public event KeyDownHandler KeyDown;
- public void Run()
- {
- bool finished = false;
- do
- {
- Console.WriteLine("Input a char");
- string response = Console.ReadLine();
- char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
- // 得到按键信息的参数
- KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
- // 触发事件
- KeyDown(this, keyEventArgs);
- } while (!finished);
- }
- }
- internal class EventReceiver
- {
- public EventReceiver(KeyInputMonitor monitor)
- {
- // 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
- monitor.KeyDown += new KeyInputMonitor.KeyDownHandler(this.OnKeyDown);
- }
- private void OnKeyDown(object sender, KeyEventArgs e)
- {
- // 真正的事件处理函数
- Console.WriteLine("Capture key: {0}", e.KeyChar);
- }
- }
- public class MainEntryPoint
- {
- public static void Main(string[] args)
- {
- // 实例化一个事件发送器
- KeyInputMonitor monitor = new KeyInputMonitor();
- // 实例化一个事件接收器
- EventReceiver eventReceiver = new EventReceiver(monitor);
- // 运行
- monitor.Run();
- }
- }
参考自:http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html。
C#的事件处理机制的更多相关文章
- java 事件处理机制:按下上下左右键控制小球的运动
/** * 加深对事件处理机制的理解 * 通过上下左右键来控制一个小球的位置 */package com.test3;import java.awt.*;import javax.swing.*;im ...
- Android事件处理机制
包括监听和回调两种机制. 1. 基于监听的事件处理: 事件监听包含三类对象,事件源,事件,事件监听器.Android的事件处理机制是一种委派式(Delegation)事件处理方式:普通组件(事件源)将 ...
- Android的两种事件处理机制
UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理. 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事 ...
- Android的Touch事件处理机制
Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一 ...
- IOS事件处理机制(关于触发者和响应者的确认)
事件处理机制 在iOS中发生触摸后,事件会加入到UIApplication事件队列(在这个系列关于iOS开发的第一篇文章中我们分析iOS程序原理的时候就说过程序运行后UIApplication会循环监 ...
- Java Swing事件处理机制
Java Swing的事件处理机制 Swing GUI启动后,Java虚拟机就启动三个线程,分别为主线程,事件派发线程(也是事件处理线程)和系统工具包线程. 主线程 :负责创建并显示该程序的初始界面: ...
- Qt事件处理机制
研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...
- core java 8~9(GUI & AWT事件处理机制)
MODULE 8 GUIs--------------------------------GUI中的包: java.awt.*; javax.swing.*; java.awt.event.*; 要求 ...
- Android的事件处理机制详解(二)-----基于监听的事件处理机制
基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制 ...
- Android的事件处理机制(一)------基于回调机制的事件处理
Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...
随机推荐
- spoj 7001
/*** 大意:计算gcd(x,y,z) =1 0<= x, y , z <= n 问有多少个这样的对 莫比乌斯反演:(反演: 用结果推原因) 函数m(m)的定义如下: 莫比乌斯反演: * ...
- 在Visual Studio 2010中安装iGraph
本安装步骤参考了:http://www.16kan.com/question/detail/182225.html Igraph actually does work with Visual C++ ...
- HttpGet()和HttpPost()
转 http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,P ...
- 转:C++:从子类访问父类的私有函数
众所周知,c和c++的数组都是不安全的,因为无论c还是c++都不提供数组边界检查功能,这使得数组溢出成为可能.从某个意义上说,c和c++是一种缺少监督的语言,然而这也正是其魅力所在.c++给予程序员更 ...
- 谷歌三大核心技术(二)Google MapReduce中文版
谷歌三大核心技术(二)Google MapReduce中文版 Google MapReduce中文版 译者: alex 摘要 MapReduce是一个编程模型,也是一个处理和生成超大数据 ...
- ZOJ 1825 compoud words
题目大意:输入一串递增的单词序列,需要找出符合条件的单词递增输出,条件是:将一个单词拆成左右两个单词后,能在输入中找到这两个单词.例如单词 alien,可以拆成 a 和 lien,而输入中刚好同时有a ...
- rollback的作用
#pragma mark - 以队列的形式添加 // 以队列的形式添加数据FMDB比较常用的添加方式 // FMDB不支持多个线程同时操作,所以一般以串行的方式实现相关操作 - (IBAction)i ...
- Android平台一些流行的使用3D技术开发的锁屏
题外话:从2007年android系统的发布开始,到2008年的第一款手机问世,再到现在击败塞班,wm,黑霉,然后遍地开花,2013年,智能机出货超过了功能机,android功不可没.一路走来,虽然a ...
- IPv6-only 的兼容性解决方案
前几天Apple宣布 6月1日后所有应用必须支持IPv6-only网络 今天抽空看了下这方面的知识 首先解释下IPv6的是什么? 维基百科的定义如下:IPv6是Internet Protocol ve ...
- 写一方法用来计算1+2+3+...n,其中n作为参数输入,返回值可以由方法名返回,也可以由参数返回
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...