你的位置:首页 > ASP.net教程

[ASP.net教程]委托、泛型委托、异步委托(新人,有问题请指出,有部分代码是拿其他博客主的)

委托

     是把一个方法当作一个参数放到声明(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 father12   {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返回随机数,显示随机数。