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返回随机数,显示随机数。

  • 相关阅读:
    git小乌龟的使用
    C语言笔记(二):数据类型(基本数据类型)、类型转换(自动转换、强制转换)
    Edge Chromium 中如何始终允许运行 Flash 内容
    【DTOJ】2704:数字互换
    【DTOJ】2703:两个数的余数和商
    【DTOJ】1001:长方形周长和面积
    Linux_simpl shell-利用Shell脚本for循环输出系统中的用户及其Shell
    Linux_Centos7安装VNC实现远程桌面
    Linux_crontab参数表示的意思
    Docke部署nginx并配置nginx
  • 原文地址:https://www.cnblogs.com/huodetiantang/p/5578832.html
Copyright © 2011-2022 走看看