• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

多用途的事件处理程序

在上一篇中,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;

        }

    }

}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#设计模式(16)——迭代器模式(Iterator Pattern)发布时间:2022-07-14
下一篇:
C#new和override的区别发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap