zoukankan      html  css  js  c++  java
  • 异步编程

    一、委托

    (一)委托声明

      (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);
            }
  • 相关阅读:
    Django报错 No module named 'django.templates'
    Django 创建 hello world
    python(Django2.0) 安装
    create-react-app踩坑记
    Vue项目的痛点
    React 错误处理(componentDidCatch)
    Vue props双向绑定
    redux 中的 redux-thunk(中间件)
    webpack 搭建React(手动搭建)
    vue interceptors(拦截器)
  • 原文地址:https://www.cnblogs.com/yuekong2010/p/8302901.html
Copyright © 2011-2022 走看看