zoukankan      html  css  js  c++  java
  • 触发事件,检查是否注册过事件的方法

    下面的代码,会发现事件没有被注册

     class Program
        {
            static void Main(string[] args)
            {
                EventCheck check = new EventCheck();
                check.OnDataArrived(new DataArrivedEventArgs() { data="Hello World!"});
                Console.ReadKey();
            }
    
            static void check_DataArrived(object sender, DataArrivedEventArgs e)
            {
                Console.WriteLine(e.data);
            }
        }
    
        class EventCheck
        {
            //第三步 use the delegate type to declare a variable that can refer to any method with the same signature as the delegate.
            //To associate the event with the method that will handle the event, add an instance of the delegate to the event. 
            //The event handler is called whenever the event occurs, unless you remove the delegate.
            internal event DataArrivedEventHandler DataArrived;
            
            //第四步
            internal void OnDataArrived(DataArrivedEventArgs e)
            {
                try
                {
                    //DataArrivedEventHandler handler = DataArrived;
                    //if (handler != null)
                    //{
                    //    handler(this, e);
                    //}
                    DataArrived += EventCheck_DataArrived;
                    if (DataArrived != null)
                    {
                        DataArrived -= EventCheck_DataArrived;
                        DataArrived(this, e);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("遇到异常{0}", ex.Message);
                }
            }
    
            void EventCheck_DataArrived(object sender, DataArrivedEventArgs e)
            {
                Console.WriteLine(e.data);
            }
        }
    
        //第二步   Represents the method that will handle an event when the event provides data.
        //This method's first parameter is of type Object and refers to the instance that raises the event. 
        //Its second parameter is derived from type EventArgs and holds the event data.
        //If the event does not generate event data, the second parameter is simply the value of the EventArgs.Empty field. 
        //Otherwise, the second parameter is a type derived from EventArgs and supplies any fields or properties needed to hold the event data.
        delegate void DataArrivedEventHandler(object sender,DataArrivedEventArgs e);  //正式写代码的时候,可以使用EventHandler<TEventArgs>泛型委托
    
        //第一步   
        //create a custom event data class, create a class that derives from the EventArgs class and provide the properties to store the necessary data. 
        //The name of your custom event data class should end with EventArgs.
        class DataArrivedEventArgs : EventArgs
        {
           internal string data;
        }

    修改第四步的代码,先将事件复制到临时变量里面,然后通过这个临时变量来处理,就不会有问题

    //第四步
            internal void OnDataArrived(DataArrivedEventArgs e)
            {
                try
                {
                    //DataArrivedEventHandler handler = DataArrived;
                    //if (handler != null)
                    //{
                    //    handler(this, e);
                    //}
                    DataArrived += EventCheck_DataArrived;
                    DataArrivedEventHandler handler = DataArrived;
                    if (handler != null)
                    {
                        DataArrived -= EventCheck_DataArrived;
                        handler(this, e);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("遇到异常{0}", ex.Message);
                }
            }
  • 相关阅读:
    struts2 ajax传值
    s:iterator遍历
    JavaScript闭包
    组合继承与寄生组合式继承
    JSP EL表达式详细介绍
    js判断字符串是否包含中文或英文
    jQuery 中 jQuery(function(){})与(function(){})(jQuery) 的区别
    HTML5--新增结构元素(2)
    HTML5--新增全局属性(1)
    nodejs的安装配置(nvm-windows)
  • 原文地址:https://www.cnblogs.com/chucklu/p/4217699.html
Copyright © 2011-2022 走看看