C#学习记录(28)事件(1)

    一.事件的含义

    事件类似于异常,因为它们都由对象引发(抛出),我们可以提供代码来处理事件。但它们也有几个重要的区别。最重要的区别是并没有与try ... catch 类似的结构来处理事件,而必须订阅(subscribe)它们。订阅一个事件的含义是提供代码,在事件发生时执行这些代码,它们称为事件处理程序。

    基本处理过程如下所示:

    (1)应用程序创建一个可以引发事件的对象。例如,假定一个即时消息传送(instant messaging)应用程序创建的对象表示一个远程用户的连接。当接收到通过该连接从远程用户传送来的信息时,这个连接对象会引发一个事件。

                        

    (2)应用程序订阅事件。为此,即时消息传送应用程序将定义一个方法,该方法可以与事件指定的委托类型一起使用,把这个方法的一个引用传送给事件,而事件的处理方法可以是另一个对象的方法,假定是表示显示设备的对象,当接收到信息时,该方法将显示即时消息。

                                     

    (3)引发事件后,就通知订阅器。当接收到通过连接对象传来的即时消息时,就调用显示设备对象上的事件处理方法。因为我们使用的是一个标准方法,所以引发事件的对象可以通过参数传送任何相关的信息,这样就大大增加了事件的通用性。

                                    

    二.快速入门

    Timer.Elapsed 事件的委托包含了事件处理程序中常见的两类参数,如下所示:
     object source——引发事件的对象的引用
     ElapsedEventArgs e——由事件传送的参数

    static int counter = 0;

    static string displayString ="This string will appear one letter at a time. ";

        static void Main(string[] args)
        {
            Timer myTimer = new Timer(100);     //定义定时器
            myTimer.Elapsed += WriteChar;       //Elapsed触发事件WriteChar
            myTimer.Start();                    //开启定时器
            Console.ReadKey();
        }

        /// <summary>
        /// 自定义事件
        /// </summary>
        /// <param name="source"></param>
        /// <param name="e"></param>ElapsedEventArgs只用在Timer.Elapsed事件处理函数中,为事件处理提供数据。
        static void WriteChar(object source, ElapsedEventArgs e)
        {     
             Console.Write(displayString[counter++ % displayString.Length]);///输出字符串
        }

            3.简单事件处理程序

                                                            

            第一步:定义事件处理程序

            private void CheckForMessage(object source, ElapsedEventArgs e) 

            {
                    Console.WriteLine("Checking for new messages.");
                    if ((random.Next(9) == 0) && (MessageArrived != null))  ///生成随机数0,并且事件不为空
                    {
                        MessageArrived("Hello Mum!");
                    }

            }

            第二步:注册事件的处理程序

             private Timer pollTimer;

            public Connection()///构造函数
            {
                pollTimer = new Timer(100); 

                pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);  ///注册Elapsed事件的一个事件处理程序

                                                      ///该事件是按定时器到时间来触发的,即开启计时后,每100ms就会触发一次。

            }

            第三步:启动事件触发程序

            myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage) ;

        

猜你喜欢

转载自blog.csdn.net/shenseyoulan/article/details/80921486