多线程的异步委托初识

异步委托的的原理就是使用了一个线程池去执行了一个委托指向的方法

EndInvoke会阻塞当前主线程,直到异步委托执行完成之后,才能继续向下执行

示例代码如下:

static void Main(string[] args)
        {
            //这里写了一个泛型委托,前两个是传递的参数,后一个是返回值,这个泛型委托调用的是AddMethod方法
            Func<int, int, int> delFun = new Func<int, int, int>(AddMethod);
            //这里是开始异步的调用这个泛型委托,传入前两个参数,之后可以执行回调函数AfterThread,如果没有可以设置为null
            //如果想要取回返回值,就可以选择把委托自身作为回调函数的参数传入,回调函数的参数类型是IAsyncResult类型
            delFun.BeginInvoke(5, 7, AfterThread, delFun);
            Console.ReadKey();
        }

        public static int AddMethod(int a,int b) 
        {
            //这里停顿两秒,是为了验证EndInvoke会阻塞当前主线程的效果
            Thread.Sleep(2000);
            return a + b;
        }

        public static void AfterThread(IAsyncResult sr) 
        {
            //AsyncResult result = (AsyncResult)sr;//拿到异步委托的执行结果,但是接受的类型是IAsyncResult的子类型AsyncResult,所以要强制转换一下
            //var del = (Func<int, int, int>)result.AsyncDelegate;//这个可以拿到委托实例,但是要看一下委托实例是什么类型,就要把这个实例转化为什么类型
            //Console.Write("异步执行后调用的回调函数方法" + del.EndInvoke(result));//这里调用EndInvoke事件,得到异步委托的执行结果
           
            //这里得到回调函数的参数,因为参数是传入的委托,所以可以得到一个委托对象
            var result = (Func<int, int, int>)sr.AsyncState;
            //result.EndInvoke(sr)就是调用委托的EndInvoke方法得到异步委托的执行结果,参数就是IAsyncResult类型
            Console.Write(result.EndInvoke(sr));
        }

 

posted @ 2014-11-28 15:29  洛晨随风  阅读(205)  评论(0编辑  收藏  举报