异步编程

一、委托

(一)委托声明

  (1)delegate

  (2)Action

    Action是无返回值的泛型委托。

  (3)Func

    Func是有返回值的泛型委托。Func<object,string,int> 表示传入参数为object, string 返回值为int的委托。

  (4)predicate

    predicate 是返回bool型的泛型委托。predicate<int> 表示传入参数为int 返回bool的委托。

二、异步

(一)异步三种模式

  1、等待模式,在发起了异步方法以及做了一些其它处理之后,原始线程就中断,并且等待异步方法完成之后再继续。

  2、轮询模式,原始线程定期检查发起的线程是否完成,如果没有则可以继续做一些其它的事情。

  3、回调模式,原始线程一直在执行,无需等待或检查发起的线程是否完成。在发起的线程中的引用方法完成之后,发起的线程就会调用回调方法,由回调方法在调用EndInvoke之前处理异步方法的结构。

(二)等待模式

        private static long Sum(int i, int j)
        {
            Debug.WriteLine("Sum");
            return i + j;
        }

        static long  SumFunc<T1, T2>(Func<T1, T2, long> func, T1 a, T2 b)
        {
            return func(a, b);
        }

        private static void DebugWrite()
        {
            Func<int, int, long> fun = Sum;
            Debug.WriteLine("begin BeginInvoke");
            IAsyncResult iar = fun.BeginInvoke(3, 5, null, null);
            Thread.Sleep(3000);
            Debug.WriteLine("end BeginInvoke");
            long count = fun.EndInvoke(iar);
            Debug.WriteLine("end EndInvoke");
        }

  1、当我们调用委托对象的BeginInvoke方法时,系统创建了一个AsyncResult类的对象。然而,它不返回类的对象的引用,而是返回对象中包含的IasyncResult接口的引用。

  2、AsyncResult对象包含一个叫做AsyncDelegate的属性,它返回一个指向被调用来开启异步方法的委托的引用。但是这个属性是类对象的一部分而是接口的一部分。

  3、IsCompleted属性返回一个布尔值,表示异步方法是否完成。

  4、AsyncState属性返回一个对象的引用,它被作为BeginInvoke方法调用时的state参数。

(三)轮询模式

  在等待模式的基础上循环判断iar.IsCompleted是否完成,完成后执行EndInvoke返回值。

(四)回调模式

 private static long Sum(int i, int j)
        {
            Debug.WriteLine("Sum");
            return i + j;
        }

        static long  SumFunc<T1, T2>(Func<T1, T2, long> func, T1 a, T2 b)
        {
            return func(a, b);
        }

        private static void DebugWrite()
        {
            Func<int, int, long> fun = Sum;
            Debug.WriteLine("begin BeginInvoke");
            IAsyncResult iar = fun.BeginInvoke(3, 5, CallBack, "传入参数");
            Thread.Sleep(3000);
            Debug.WriteLine("end EndInvoke");
        }

        private static void CallBack(IAsyncResult iar)
        {
            AsyncResult asyncResult = (AsyncResult)iar;
            Debug.WriteLine(iar.AsyncState);
            var delegateAsync = asyncResult.AsyncDelegate;
            Func<int,int,long> fun = (Func<int, int, long>)delegateAsync;
            var result = fun.EndInvoke(iar);
        }

 

posted on 2018-01-17 14:54  yuekong2010  阅读(141)  评论(0编辑  收藏  举报