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

委托

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

时间: 2024-10-13 19:40:21

委托、泛型委托、异步委托(新人,有问题请指出,有部分代码是拿其他博客主的)的相关文章

Func&lt;T&gt;与Action&lt;T&gt;委托泛型

Func<T>与Action<T>委托泛型介绍 .Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public delegate void Action(); public delegate void Action<T1>(T1 arg1); public delegate void Action<T1, T2>(T1 arg1

多线程的异步委托初识

异步委托的的原理就是使用了一个线程池去执行了一个委托指向的方法 EndInvoke会阻塞当前主线程,直到异步委托执行完成之后,才能继续向下执行 示例代码如下: static void Main(string[] args) { //这里写了一个泛型委托,前两个是传递的参数,后一个是返回值,这个泛型委托调用的是AddMethod方法 Func<int, int, int> delFun = new Func<int, int, int>(AddMethod); //这里是开始异步的调

异步委托(APM)使用Func异步操作,处理耗时操作

使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Demo 7 { 8 class Program 9 { 10 11 static void Main(string[] args) 12 { 13 Func<string> fun = new Func<s

C#基础之--线程、任务和同步:一、异步委托

创建线程的一种简单方式是定义一个委托,并异步调用它.委托是方法的类型安全的引用. Delegate还支持异步地调用方法.在后台Delegate类会创建一个执行任务的线程. 为了说明委托的异步特性,从一个需要一定的时间才能执行完毕的方法开始. TakesAWhile方法至少需要经过第2个变量传递的毫秒数才能执行完,因 为它调用了Thread.Sleep()方法. static int TakesAWhile(int data, int ms) { Console.WriteLine("TakesA

C#: 异步委托

http://www.cnblogs.com/yingzhongwen/p/4568350.html 讲了委托与事件,但是对异步委托研究得还不够深入. http://www.cnblogs.com/lxblog/archive/2012/12/11/2813893.html http://www.cnblogs.com/IAmBetter/archive/2012/02/13/2348912.html http://blog.csdn.net/lexiaoyao20/article/detail

C#固定时间执行指定事件(观察者模式+异步委托)

最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指教. 关于观察者模式,我在这里就不做讲解了,如有不懂,可以参考相关文章. 那么开始入正题. 主要有三个页面:Observer.cs(观察者).Subject.cs(通知者).Form1.cs Observer.cs class Observer { /// <summary> /// 执行事件A

使用异步委托执行线程(delegate)

由于异步委托产生的线程与应用程序主线程是分开执行的,若主线程要获取异步委托线程的结果,则主线程需要等待异步委托的执行结果. BeginInvoke是Delegate类型的一个方法,它的返回类型为IAsyncResult,通过该接口,可以获得异步委托的执行信息. 1.投票技术:等待异步委托结果的一种方法是投票技术,该技术的实现原理是通过IAsyncResult接口的IsComplete属性来检查委托是否完成了任务.EndInvote方法获取执行结果.举个例子,如下: 执行后的效果: 2.访问等待句

C# 多线程操作之异步委托

标签: 多线程任务nullstringhtml工作 2012-06-29 23:00 1276人阅读 评论(0) 收藏 举报  分类: C/C++/C#/dotnet(126)  目录(?)[+] 在应届生找工作的时候,多线程操作几乎是所有的公司都会问及的一个基本问题. 这里做了一个多线程操作的总结,这里总结了通过异步委托来实现多线程操作. 定义一个委托,是创建一个线程的最简单的方法,并且异步调用它.委托是方法的类型安全的引用.同时委托还智齿异步调用方法. 委托使用线程池来完成异步任务. 当自己

.NET委托解析(异步委托)

上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源码解析. 首先本文只会从委托的层面的去编写,不会涉及到深层次的异步.(后续的系列中将会对异步进行深入讲解.敬请关注.). 委托的异步调用方式 在上一篇中我们在实例中是直接通过委托对象的,例如: private static void Main(string[] args)  {        Pro