zoukankan      html  css  js  c++  java
  • 委托、泛型委托、异步委托(新人,有问题请指出,有部分代码是拿其他博客主的)

    委托

         是把一个方法当作一个参数放到声明(deletgate)委托中。给另一个方法使用,或者直接执行委托。

     1     class Delegates
     2     {
     3         public delegate void mydelegate(string msg);
     4         static void Main(string[] args)
     5         {
     6             mydelegate myd = new mydelegate(father.BuyToys);
     7             myd("BBB");
     8             Console.Read();
     9         }
    10     }
    11     public class father
    12     {
    13         public static void BuyToys(string msg)
    14         {
    15             Console.WriteLine(msg);
    16             Console.WriteLine("AAA");
    17         }
    18     }

    上面可以看出首先声明一个委托,在实例委托时把father类中的BuyToys方法当作参数放到委托中。然后在使用委托。输出结果:BBB  AAA。

    泛型委托

    Action<T>:没有返回值的委托。或者返回是空的委托(就是直接返回return)

    Func<T,TResult>:必须要有返回值的委托。T是带入参数的类型,TResule是返回参数的类型

    泛型委托详细博客

    一般使用委托需要先显示声明委托。

    public delegate void mydelegate(string msg);

    而如果使用泛型委托就可以不用显示声明委托。

        public delegate void ShowName();
        public delegate void ShowNameWithParameter(string name);
        ShowName showName = person.DisplayName;
        showName();
        ShowNameWithParameter showNameWithParameter = person.DisplayName;
        showNameWithParameter(person.InstanceName);
        //上面是显示委托,下面是泛型委托
        Action actionShowName = person.DisplayName;
        actionShowName();
        Action<string> actionShowName1 = person.DisplayName;
        actionShowName1(person.InstanceName);
    Func<string, int> funReturnName = person.GetAgeByName;
        Console.WriteLine("Age:{0}", funReturnName(person.InstanceName));
    
    

    异步委托

    异步委托需要使用到BeginInvoke,这个是把BeginInvoke方法以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值。

            private static int newTask(int ms)
            {
                Console.WriteLine("任务开始");
                Thread.Sleep(ms);
                Random random = new Random();
                int n = random.Next(10000);
                Console.WriteLine("任务完成");
                return n;
            }
            private delegate int NewTaskDelegate(int ms);
            static void Main(string[] args)
            {
                //NewTaskDelegate task = newTask;
                Func<int, int> task1 = newTask;
                IAsyncResult asyncResult = task1.BeginInvoke(2000, null, null);
    
                // EndInvoke方法将被阻塞2秒
                int result = task1.EndInvoke(asyncResult);
                Console.WriteLine(result);
                Console.Read();
            }

    上面的执行结果是,先出现任务开始,暂停2秒,获取随机数,显示任务完成,最后因为EndInvoke返回随机数,显示随机数。

  • 相关阅读:
    美化单选按钮
    url的处理
    时间戳处理
    模板渲染引擎手册
    Web前端工具——Live Reload – Chrome扩展
    属性(Properties)和字段在C#中的关系
    MVC3中的Model
    使用System.Web.Mvc.Ajax
    javascript之DOM操作
    Javascript之BOM(window对象)
  • 原文地址:https://www.cnblogs.com/huodetiantang/p/5578832.html
Copyright © 2011-2022 走看看