C# 委托异步回调 基本使用方法

首先,先理清出一个概念:
delegate 与Delegate有什么区别?
Delegate:是一个抽象基类,它引用静态方法或引用类实例及该类的实例方法。然而,只有系统和编译器可以显式地从 Delegate 类派生出委托类型。
MulticastDelegate:是一个继承于Delegate的类,其拥有一个带有链表格式的委托列表,该列表称为调用列表,在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。平常我们声明一个delegate的类型,都是继承于MulticastDelegate类的(注意:不能显式地从此类进行派生。这点与Delegate类是一样的,只有系统和编译器也可以显示地进行派生)。
delegate 是一个C#关键字,用来定义一个新的委托类型(继承自MulticastDelegate类)。

其中IAsyncResult的 CompletedSynchronously属性不是很明白

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {          
            Func<int> Fuc = () =>
            {
                int i = 5;
                while (i>=0)
                {
                    Console.WriteLine("----------"+i);
                    i--;
                    Thread.Sleep(500);
                }
                return 6;
            };
            ManualResetEvent  re= new ManualResetEvent(false);
            
           
            var iarOut= Fuc.BeginInvoke(
                (iar) => {
                    //AsyncState可以得到传入参数,这里即"Test"
                    //一般也可以传入调用函数自身,可以免去转化AsyncResult来得到
                    var parm = iar.AsyncState as string;

                    Console.WriteLine("Pram:"+parm);

                    //要将传递过来的IAsyncResult的参数转化为AsyncResult
                    //才能得到原调用方法
                    AsyncResult ar = iar as AsyncResult;
                    
                    var caller = ar.AsyncDelegate as Func<int>;//得到调用方法,即Fuc

                    //调用EndInvoke会阻塞线程直到方法执行完毕,这里是执行完毕的回调不会阻塞
                    var returnValue = caller.EndInvoke(iar);
                    Console.WriteLine("Result:"+returnValue);
                    re.Set();
                },
                "Test");

            //等待回调方法执行完毕后才继续执行
            re.WaitOne();

            Console.WriteLine("----------Complete");
        }

    }

}

 

 

posted @ 2012-07-05 13:34  Bug山Bug海  阅读(341)  评论(0编辑  收藏  举报