zoukankan      html  css  js  c++  java
  • Events基本概念----Beginning Visual C#

    一个事件的发生需要有触发条件,如定时发生,鼠标点击等,以及即将发生的事件本身,因此,events相关的最简单的示例如下:

    // 时间触发器
    class TimerTrigger
    {
        private Timer myTimer;
    
        public TimerTrigger() 
        {
            myTimer = new Timer(100);
        }
        
        public TimerTrigger(int timeInterval)
        {
            myTimer = new Timer(timeInterval);
        }
    
        // 向时间触发器添加具事件的handler
        public void AddEventHander(ElapsedEventHandler source)
        {
            myTimer.Elapsed += source;
        }
    
        public void Start()
        {
            myTimer.Start();
        }
    
        public void Stop()
        {
            myTimer.Stop();
        }
    }
    
    class Program
    {
        static int counter = 0;
        static string displayString = 
            "This string will appear one letter at a time. ";
    
        // 即将被添加到时间触发器的事件
        static void WriteChar(object source, ElapsedEventArgs e)
        {
            Console.Write(displayString[counter++ % displayString.Length]);
        }
    
        public static void Main()
        {
            TimerTrigger timerTrigger = new TimerTrigger(100);
            timerTrigger.AddEventHander(new ElapsedEventHandler(WriteChar));
            timerTrigger.Start();
            Console.ReadLine();
        }
    }

    在上面的例子的main函数中,直接使用了c#自带的ElapsedEventHandler delegated类型,那么如何自定义事件处理函数呢?具体如下:

    // 自定义时间处理代表
    public delegate void MessageHandler(string message);
    
    class TimerTrigger
    {
        private Timer myTimer;
        private event MessageHandler MessageArrived;
    
        public TimerTrigger(int timeInterval)
        {
            myTimer = new Timer(timeInterval);
            myTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
        }
    
        public void AddEventHandler(MessageHandler source)
        {
            MessageArrived += source; 
        }
    
        public void Start()
        {
            myTimer.Start();
        }
    
        public void Stop()
        {
            myTimer.Stop();
        }
    
        private void CheckForMessage(object source, ElapsedEventArgs e)
        {
            Console.WriteLine("Checking for new messages.");
            if (MessageArrived != null)
            {
                MessageArrived("hello world");
            }
    
        }
    }
    
    class Program
    {
        static int counter = 0;
    
        static void WriteFirstMessage(string message)
        {
            Console.WriteLine("The First {0} number: {1}", message, counter++);
        }
    
        static void WriteSecondMessage(string message)
        {
            Console.WriteLine("The Second {0} number: {1}", message, counter++);
        }
    
        public static void Main()
        {
            TimerTrigger timerTrigger = new TimerTrigger(100);
            timerTrigger.AddEventHandler(new MessageHandler(WriteFirstMessage));
            timerTrigger.AddEventHandler(new MessageHandler(WriteSecondMessage));
            timerTrigger.Start();
            Console.ReadLine();
        }
    }

    在上述的例子中,将消息传递给处理事件所用的函数为WriteFirstMessage(string message),其传递的参数为string类型的。再考虑道<Timer>.ElapsedEventHandler所代表的函数的传递参数为:(object source, ElapsedEventArgs e)两个参数,那么我们能否实现类似的形式呢?这是可以的,如下:

    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;
        }
    }
             
    public delegate void MessageHandler(TimerTrigger source,
        MessageArrivedEventArgs e);
    
    public class TimerTrigger
    {
        private Timer myTimer;
        private event MessageHandler MessageArrived;
    
        public TimerTrigger(int timeInterval)
        {
            myTimer = new Timer(timeInterval);
            myTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
        }
    
        public void AddEventHandler(MessageHandler source)
        {
            MessageArrived += source; 
        }
    
        public void Start()
        {
            myTimer.Start();
        }
    
        public void Stop()
        {
            myTimer.Stop();
        }
    
        private void CheckForMessage(object source, ElapsedEventArgs e)
        {
            Console.WriteLine("Checking for new messages.");
            if (MessageArrived != null)
            {
                MessageArrived(this, new MessageArrivedEventArgs("hello world"));
            }
    
        }
    }
    
    class Program
    {
        static int counter = 0;
    
        static void WriteFirstMessage(TimerTrigger source, MessageArrivedEventArgs e)
        {
            Console.WriteLine("The First {0} number: {1}", e.Message, counter++);
        }
    
        static void WriteSecondMessage(TimerTrigger source, MessageArrivedEventArgs e)
        {
            Console.WriteLine("The Second {0} number: {1}", e.Message, counter++);
        }
    
        public static void Main()
        {
            TimerTrigger timerTrigger = new TimerTrigger(100);
            timerTrigger.AddEventHandler(new MessageHandler(WriteFirstMessage));
            timerTrigger.AddEventHandler(new MessageHandler(WriteSecondMessage));
            timerTrigger.Start();
            Console.ReadLine();
        }
    }
  • 相关阅读:
    Atiitt 对象转换json 序列化规范 Java 循环引用的解决 设置序列化层次深度 去除不必的属性 太长不方便月度 jsonObject.remove("num1"); Prety fo
    Atitit 研发管理之道 attilax总结 艾龙 著 研发管理 1 简介 1 基本理念 2 基本原则 2 内容 3 团队建设 4 流程设计 4 成本管理 4 项目管理 4 绩效管理 4 风险管理
    Atitit 软件设计中的各种图纸 uml 之道 1. 常见设计成果与图纸 1 1.1. ui原型图与html 1 1.2. 业务逻辑 伪代码 各种uml图 1 1.3. 业务逻辑 流程图 ns
    Atitit ForkJoinTask的使用以及与futuretask的区别 1.1. Forkjoin原理图 1 1.2. Fork/Join使用两个类完成以上两件事情:ForkJoinTask
    Atitit 利用前端cache indexdb localStorage 缓存提升性能优化attilax总结 1.1. indexdb 更加强大点,但是结果测试,api比较繁琐 使用叫麻烦些 1
    Atitit pg10分区 总结 1.1. create table tmp_log (  1 1.2. 创建索引 1 1.3. 查看表 in pgadmin4 2 2. 二 分区表管理 2 2.1
    ASP.NET在IIS上部署使用Oracle数据库无法连接数据库解决方法(转载)
    .net3.5SP1开发项目引发的血案
    仿QQ弹出窗口
    ASP.NET中的数据绑定:哪个更快?
  • 原文地址:https://www.cnblogs.com/grass-and-moon/p/4136912.html
Copyright © 2011-2022 走看看