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

    什么是异步编程呢?举个简单的例子:

    using System.Net.Http;
    using System.Threading.Tasks;
    using static System.Console;
    
    namespace Core
    {
        class Async
        {
            static void Main()
            {
                Start();
                End();
            }
    
            static void Wait()=>WriteLine("waiting...");
            static void End()=>WriteLine("end...");
            static int Start()
            {
                WriteLine("start...");
                HttpClient client = new HttpClient();
                Waiting();
                var result = client.GetStringAsync("https://www.visualstudio.com/");
                string str = result.Result;
                return str.Length;
            }
        }
    }

    上面这段代码中,Main方法中的代码是按照自上而下的顺序执行的。网络状况不佳时,Start()方法是比较耗时(注意,这里在Start方法中调用了异步方法GetStringAsync,但该方法在此处是以同步方式执行的,具体原因下文会进行说明),在Start()方法执行完毕之前,整个程序处于阻塞状态。而异步编程可以很好的解决这个问题,一句简单的话来概括异步编程就是,程序无须按照代码顺序自上而下的执行

    async/await

    C#5.0新增了async和await关键字,使用这两个关键字可以大大简化异步编程

    使用 async 关键字可将方法、lambda 表达式匿名方法标记为异步,即,方法中应该包含一个或多个await表达式,但async关键字本身不会创建异步操作。

    public async Task Asy()
    {
      //do something...
    }
    这里需要注意一点,若使用async关键字标记的方法中没有使用await关键字(编译器会给出警告但不报错),那么该方法将会以同步方式执行。

    定义异步方法的几点要求

    定义一个异步方法应满足以下几点:

    • 使用async关键字来修饰方法
    • 在异步方法中使用await关键字(不使用编译器会给出警告但不报错),否则异步方法会以同步方式执行
    • 尽量不使用void作为返回类型,若希望异步方法返回void类型,请使用Task
    • 异步方法名称以Async结尾
    • 异步方法中不能声明使用ref或out关键字修饰的变量

    下面定义一个异步方法StartAsync()

    static async Task<int> StartAsync()
    {
        HttpClient client = new HttpClient();
        var str = await client.GetStringAsync("https://www.visualstudio.com/");
        return str.Length;
    }

    异步方法的返回类型

    • Task<T>
      如果在调用匿名方法时使用了await关键字,且匿名方法的返回类型是Task<T>,那么我们得到的返回类型是T。若未使用await关键字,则返回类型是Task。未使用await,调用GetStringAsync方法时result是Task类型。

      

    从上图我们可以看到调用GetStringAsync方法时未使用await关键字,result是Task类型,我们可以通过GetType()方法来获取result的详细类型信息:

    从上图可以看到result的类型全名是System.Threading.Tasks.Task


     

    从上图我们可以看到使用await关键字时,result是string类型,而匿名方法GetStringAsync的返回类型是Task<string>

    • Task
      如果在调用匿名方法时使用了await关键字,且匿名方法的返回类型是Task,那么我们得到的返回类型是void。若为使用await关键字,则得到的返回类型是Task。

    • void
      不建议使用void作为异步方法的返回值。
      因为使用Task或Task<TResult>任务作为返回值,其属性携带有关其状态和历史记录的信息,如任务是否完成、异步方法是否导致异常或已取消以及最终结果是什么。而await运算符可访问这些属性。

    异步方法执行流程


    异步程序执行流程
  • 相关阅读:
    时序图和类图
    word文档一个表格分割成两个表格
    Spring 报错:Error creating bean with name
    怎么让线条快速选中并组合多个形状
    [扩展阅读] Python 函数修饰符(装饰器)的使用
    第039 类和对象 拾遗
    吴恩达深度学习 第一课第三周课后编程作业
    第038讲:类和对象:继承 课后测试题及答案
    廖雪峰Python教程--使用模块
    第037讲:类和对象:面向对象编程
  • 原文地址:https://www.cnblogs.com/youmingkuang/p/11281870.html
Copyright © 2011-2022 走看看