代码改变世界

C#学习笔记(十二):事件进阶

2006-02-06 15:39  努力学习的小熊  阅读(1340)  评论(0编辑  收藏  举报

多用途的事件处理程序

在上一篇中,Timer.Elapsed事件的签名包含了时间处理程序常见的两个参数:

1object source——引发事件的对象的引用

2ElapsedEventArgs e——由事件传送的参数

在这个事件中使用object类型参数的原因是,我们常常要为由不同对象引发的几个相同事件使用同一事件处理程序,但仍要指定哪个对象引发了事件。

 

我们在调用处理事件的函数时,发送一个引发事件的对象引用,将其作为事件处理程序的一个参数,就可以为不同的对象定制处理程序的响应。利用该引用可以访问源对象,包括它的属性。

通过发送包含在派生于System.EventArgs(与ElapsedEventArgs相同)的类中的参数,就可以将其他必要信息作为参数(例如:MessageArrivedEventArgs类上的Message参数)

 

在实际程序中我们将委托的定义作了如下的修改:

public delegate void MessageHandler(Connection source, MessageArrivedEventArgs e);

然后又将响应的Display类的响应事件处理程序作了如下修改:

        public void DisplayMessage(Connection source, MessageArrivedEventArgs e)

        {

            Console.WriteLine("Message arrived from:{0}",source.Name);

            Console.WriteLine("Message Text:{0}",e.Message);

        }

其中用来接收对象并区分对象的是Connection source,另一个参数的定义是按照前面将的继承了System.EventArgs进行定义的MessageArrivedEventArgs,用它来传递其他的参数信息。

 

到这里我们就可以完全根据需要自定义我们自己需要响应事件是需要做的事情了,在原来的类不能满足需要时就进行这种响应的扩展即可。

 

 

本例的源程序:

Connection

using System;

using System.Timers;

 

namespace Ch12Ex03

{

    public delegate void MessageHandler(Connection source, MessageArrivedEventArgs e);

 

    public class Connection

    {

        public event MessageHandler MessageArrived;

 

        private string name;

 

        public string Name

        {

            get

            {

                return name;

            }

            set

            {

                name = value;

            }

        }

 

        private Timer pollTimer;

 

        public Connection()

        {

            pollTimer = new Timer(100);

            pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);

        }

 

        public void Connect()

        {

            pollTimer.Start();

        }

 

        public void Disconnect()

        {

            pollTimer.Stop();

        }

 

        private void CheckForMessage(object source, ElapsedEventArgs e)

        {

            Console.WriteLine("Checking for new message.");

            Random random = new Random();

            if((random.Next(9) == 0) && (MessageArrived != null))

            {

                MessageArrived(this,new MessageArrivedEventArgs("Hello Mum!"));

            }

        }

    }

}

Class1类:

using System;

 

namespace Ch12Ex03

{

    /// <summary>

    /// Class1 的摘要说明。

    /// </summary>

    class Class1

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main(string[] args)

        {

            Connection myConnection1 = new Connection();

            myConnection1.Name = "First connection.";

 

            Connection myConnection2 = new Connection();

            myConnection2.Name = "Second connection.";

 

            Display myDisplay = new Display();

 

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

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

 

            myConnection1.Connect();

            myConnection2.Connect();

 

            Console.ReadLine();

        }

    }

}

Display类:

using System;

 

namespace Ch12Ex03

{

    /// <summary>

    /// Display 的摘要说明。

    /// </summary>

    public class Display

    {

        public void DisplayMessage(Connection source, MessageArrivedEventArgs e)

        {

            Console.WriteLine("Message arrived from:{0}",source.Name);

            Console.WriteLine("Message Text:{0}",e.Message);

        }

    }

}

MessageArrivedEventArgs类:

using System;

 

namespace Ch12Ex03

{

    /// <summary>

    /// MessageArrivedEventArgs 的摘要说明。

    /// </summary>

    public class MessageArrivedEventArgs : EventArgs

    {

        private string message;

 

        public string Message

        {

            get

            {

                return message;

            }

        }

 

        public MessageArrivedEventArgs()

        {

            message = "No message sent.";

        }

 

        public MessageArrivedEventArgs(string newMessage)

        {

            message = newMessage;

        }

    }

}