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);
                }
            }
  • 相关阅读:
    MR中简单实现自定义的输入输出格式
    简单实现CombineFileInputFormat
    提高mapreduce性能的七点建议
    MR中使用sequnceFIle输入文件
    Hive中使用LZO
    JVM启动参数详解 (转)
    ubuntu12.04中shell脚本无法使用source的原因及解决方法
    hadoop 错误
    poj 3211 Washing Clothes
    hdu 3535 AreYouBusy
  • 原文地址:https://www.cnblogs.com/chucklu/p/4217699.html
Copyright © 2011-2022 走看看