zoukankan      html  css  js  c++  java
  • 事件、委托、异步

    委托 delegate

    委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。委托可以指向任何和它参数一致的方法,代码示例如下:

    //定义委托
    public delegate void NameChange(string userName, int age);
    //指定要引用的方法
    NameChange nam = new NameChange(UserChange);
               nam("good", 24);
    private void UserChange(string userName, int age)
           {
               Response.Write(userName + age.ToString());
           }

    事件 Event

    事件是一种模式,搞明白事件首先要弄清楚谁是发布者,谁是订阅者。

    下面代码示例中,User就是事件的发布者:

    public class Users
    {
        public event EventHandler HanderUser;
    
        public virtual void OnHandler(EventArgs e)
        {
            if (HanderUser != null)
            {
                HanderUser(this, e);
            }
        }
    }

    下面代码显示如何订阅事件,就是事件的接收者。

    protected void Page_Load(object sender, EventArgs e)
    {
        Users user = new Users();
        user.HanderUser += new EventHandler(user_HanderUser);
    }
           
    void user_HanderUser(object sender, EventArgs e)
    {
        Response.Write("事件发生了;");
    }

    EventHandler和Delegate

    EventHandler 是一个预定义的委托,专用于表示不生成数据的事件的事件处理程序方法。如果事件生成数据,则必须提供自己的自定义事件数据类型,并且必须要么创建一个委托,其中第二个参数的类型为自定义类型,要么使用泛型 EventHandler 委托类并用自定义类型替代泛型类型参数。也就是说下面的代码1和代码2是等效的:

    代码片段1:

    public class Group
       {
           public delegate void GroupHandler(object sender, EventArgs e);
           public event GroupHandler handler;
    
           public virtual void OnHandler(EventArgs e)
           {
               if (handler != null)
               {
                   handler(this, e);
               }
           }
       }
    
    代码片段2:
    public class Group
       {
           public event EventHandler handler;
           public virtual void OnHandler(EventArgs e)
           {
               if (handler != null)
               {
                   handler(this, e);
               }
           }
       }
    使用EventHandler我们默认定义了返回值为空的委托,如果我们需要自定义委托的数据类型,那么就需要使用delegate关键字来自定义事件类型。
    利用事件来实现系统的扩展
    事件有什么作用,最初在学习事件时,看到了经常举邮件发送的例子。那么在实际应用中,我们通常利用事件来做什么呢?以用户注册为例子,在我们公司的系统中,除了在主系统中写入
    写入用户数外,还需要在一个子系统中写入用户数据。
     
    //事件源,也就是事件的发布者
    public class Users
    {
        public static event EventHandler SaveUserAfter;
    
        public virtual void OnHandler(EventArgs e)
        {
            if (SaveUserAfter != null)
            {
                SaveUserAfter(this, e);
            }
        }
    
        public void SaveUser(string userName, string password, string email)
        {
            OnHandler(new EventArgs());
        }
    }
    //事件订阅者,事件发生的接收者
    public class Staffers
    {
        public Staffers()
        {
            //订阅事件
            Users.SaveUserAfter += new System.EventHandler(user_SaveUserAfter);
        }
    
        void user_SaveUserAfter(object sender, System.EventArgs e)
        {
            throw new Exception("write staffers");
        }
    }

    事件的激活和触发

    protected void Page_Load(object sender, EventArgs e)
    {
        //把订阅事件的对象激活在应用程序中
        Staffers staffer = new Staffers();
        Users user = new Users();
        //触发事件
        user.SaveUser("good", "ch-girl.net", "test@ch-girl.net");
    }

    通过这样的方式,来实现了Users和Staffers的解耦,增加了Users在保存时的扩展性,以后我们需要把User信息保存到更多子系统时,只需要增加一个订阅者然后注册到系统中就行了。

    委托与异步编程

    public delegate void NameChange(string userName, int age);
    protected void Page_Load(object sender, EventArgs e)
    {
        NameChange name = new NameChange(ShowUserInfo);
    
        IAsyncResult result = name.BeginInvoke("good", 23, null, null);
        Response.Write("Page_load");
    }
    
    private void ShowUserInfo(string userName, int age)
    {
        Thread.Sleep(5000);
        //Write File
    }
  • 相关阅读:
    Delphi IDE 设置
    我最喜欢的歌曲
    Window 常用文件
    Delphi TTable 组件
    Delphi TDatabase 组件
    c语言->和 .
    Shell 工具之 gawk
    Shell 工具之 sed
    Shell 语法之函数
    Shell 语法之信号与作业
  • 原文地址:https://www.cnblogs.com/TransTown/p/1987568.html
Copyright © 2011-2022 走看看