c#事件实例二

c#事件实例二

事件驱动程序与过程式程序最大的不同就在于,程序不再不停地检查输入设备,而是呆着不动,等待消息的到来,每个输入的消息会被排进队列,等待程序处理它。如果没有消息在等待,

则程序会把控制交回给操作系统,以运行其他程序。

操作系统只是简单地将消息传送给对象,由对象的事件驱动程序确定事件的处理方法。操作系统不必知道程序的内部工作机制,只是需要知道如何与对象进行对话,也就是如何传递消息。

先来看看事件编程有哪些好处。

1.使用事件,可以很方便地确定程序执行顺序。

2.当事件驱动程序等待事件时,它不占用很多资源。

3.事件简化了编程。

事件(event)
    我们可以把事件编程简单地分成两个部分:事件发生的类(书面上叫事件发生器)和事件接收处理的类。事件发生的类就是说在这个类中触发了一个事件,但这个类并不知道哪个个对象或方法将会加收到并处理它触发的事件。所需要的是在发送方和接收方之间存在一个媒介。这个媒介在.NET Framework中就是委托(delegate)。在事件接收处理的类中,我们需要有一个处理事件的方法。好了,我们就按照这个顺序来实现一个捕获键盘按键的程序,来一步一步说明如何编写事件应用程序。

namespace EventLearn001
{
    /*
    因为在我们键盘按键事件中要包含按键信息,所以要派生一个KeyEventArgs类,来保存按键信息,好让后面知道按了哪个键
     * */
    internal class KeyEventArgs : EventArgs
    {
        private char keyChar; //私有字段
        public KeyEventArgs(char keyChar)
            : base()
        {
            this.keyChar = keyChar;
        }
        public char KeyChar //公开属性
        {
            get
            {
                return keyChar;
            }
        }
    }
    //再创建一个事件发生的类keyInputMonitor,这个类用于监控键盘的输入并处罚一个事件;
    internal class KeyInputMonitor
    {
        //创建一个委托,返回类型为Void,两个参数
        public delegate void KeyDownHandler(Object sender, KeyEventArgs e);
        //创建的委托和特定事件关联,
        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]);
                switch (responseChar)
                {
                    case ‘x‘: finished = true;
                        break;
                    default:
                        //得到按键信息的参数
                        KeyEventArgs args = new KeyEventArgs(responseChar);
                        //出发事件
                        KeyDown(this,args);
                        break;
                    //KeyDown( this, KeyEventArgs );一句,这就是触发事件的语句,并将事件交由KeyDownHandler这个委托来处理,
                    //委托指定事件处理方法去处理事件,
                    //这就是事件接收方的类的事情了。
                    //参数this是指触发事件的对象就是本身这个对象,keyEventArgs包含了按键信息
                }

            } while (!finished);

        }

    }

    //最后创建一个事件接收方的类,这个类先产生一个委托实例,
    //再把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。然后提供一个方法回显按键信息。
    internal class EventReceiver
    {
        public EventReceiver(KeyInputMonitor monitor)
        {
            monitor.KeyDown += onKeyDown;
        }

        private void onKeyDown(Object sender, KeyEventArgs e)
        {
            KeyInputMonitor obj = (KeyInputMonitor)sender;//可以将他强制转化成其他使用的内;
            Console.WriteLine("Capture key {0}",e.KeyChar);
        }

    }
    class Program
    {
        static void Main(string[] args)
        {

            //实例化一个事件发送器;
            KeyInputMonitor monitor = new KeyInputMonitor();
            //实例化一个接受器
            EventReceiver eventReceiver = new EventReceiver(monitor);

            monitor.Run();

        }
    }
}
时间: 2024-08-08 01:27:24

c#事件实例二的相关文章

鼠标指针停止运动触发事件实例代码

鼠标指针停止运动触发事件实例代码:在js中有有内置的鼠标各种事件,比如click事件,mousemove事件等等,但是并没有鼠标指针停止运动这个事件,下面就利用jquery模拟实现此效果,希望能够给需要的朋友带来一定的帮助.代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="ht

C#编程之委托与事件四(二)【转】

C#编程之委托与事件(二) 我在上一篇文章(C#编程之委托与事件(一) )中通过示例结合的方法介绍了委托,在本文中,我同样以代码示例的方式来介绍C#里的事件机制. 二.事件   1.了解概念      事件就是当对象或类状态发生改变时,对象或类发出的信息或通知.发出信息的对象或类称为"事件源",对事件进行处理的方法称为"接收者",通常事件源在发出状态改变信息时,它并不知道由哪个事件接收者来处理.这就需要一种管理机制来协调事件源和接收者,C++中通过函数指针来完成的.

WPF中的多进程(Threading)处理实例(二)

原文:WPF中的多进程(Threading)处理实例(二) 1 //错误的处理 2 private void cmdBreakRules_Click(object sender, RoutedEventArgs e) 3 { 4 Thread thread = new Thread(UpdateTextWrong); 5 thread.Start(); 6 } 7 8 private void UpdateTextWrong() 9 { 10 txt.Text = "Here is some n

DWR入门实例(二)

DWR(Direct Web Remoting) DWR is a Java library that enables Java on the server and JavaScript in a browser to interact and call each other as simply as possible. Dwr能让在服务器端的java代码和浏览器客户端的javascript代码尽可能简单的相互调用. DWR is Easy Ajax for Java!  官网:http://d

WPF自定义路由事件(二)

WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件. 1.WPF内置路由事件 WPF中的大多数事件都是路由事件,WPF有3中路由策略: 具体不多讲,单需要注意的是WPF路由事件是沿着VIsualTree传递的.VisualTree与LogicalTree的区别在于:LogicalTree的叶子节点是构成用户界面的控件(xaml紧密相关),而VisualTree要连控件中的细微结构也

iOS事件机制(二)

iOS事件机制(二) DEC 29TH, 2013 本篇内容接上一篇iOS事件机制(一),本次主要介绍iOS事件中的多点触控事件和手势事件. 从上一篇的内容我们知道,在iOS中一个事件用一个UIEvent对象表示,UITouch用来表示一次对屏幕的操作动作,由多个UITouch对象构成了一个UIEvent对象.另外,UIResponder是所有响应者的父类,UIView.UIViewController.UIWindow.UIApplication都直接或间接的集成了UIResponder.关于

Hibernate实例二

Hibernate实例二 一.测试openSession方法和getCurrentSession方法 hebernate中可以通过上述两种方法获取session对象以对数据库进行操作,下面的代码以及注解是对两种方法的辨析 SessionTest.java 1 import java.sql.Connection; 2 import java.sql.SQLException; 3 import java.util.Date; 4 5 import org.hibernate.Session; 6

Linux DNS的主从服务器配置实例(二)

在主DNS服务器运行正常的情况下,在另外的一台与之相同的服务器上配置从DNS服务器:操作如下: 我们这里创建DNS从服务器是实验,没有注册,,实际工作中需要注册才能正常使用,明白!!嘻嘻你懂得! 从服务器配置前提调试:(网络必须相同,小孩都知道的!)  1.统一时间  #ntpdate 172.16.0.1 -----指定时间服务器地址(瞬间跟新时间)  #corntab -e----------------------计划任务可以设置定期更新   */3 * * * * /sbin/ntpda

c#事件实例一

c#事件实例一Observe设计模式: Observe设计模式是为了定义对象之间一种一对多的额依赖关系,以便当一个对象的状态改变时, 其他依赖于它的对象会被自动告知并更新,是一种解耦的设计模式滴呀: subject:它往往包含其他对象所感兴趣的内容,在本例子中,热水器就是一个监视对象, Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observer则会采取相应的行动. 在本范例中,Observer有警报器和显示器,它们采取的行动分