浏览器标题切换
浏览器标题切换end

Intern Day20 - C#异步编程 - async和await

async和await介绍

async和await是 C# 的语法糖,作用:用来处理异步编程(用来简化异步编程模型)。

参考视频,戳这里

同步概念

概念:多个方法顺序执行,后一个会等待前一个执行完成后,才开始执行。

异步概念

概念:调用一个方法 A ,调用后会立即返回(不用等方法 A 执行完成),接着调用后面的方法 B。比如:电脑是A,喝水是B,我在电脑开机的时候可以去喝水,不用等电脑开完机再去喝。

一般我们需要异步的地方都是在进行比较耗时的操作,比如说磁盘IO、网络IO,当以同步的方式调用系统API进行磁盘读取或者获取网络数据的时候,线程会阻塞在那里等待什么事也干不了,直到操作系统从底层返回IO数据。异步模式就是在执行耗时IO API的时候线程不等待结果而是直接返回并注册一个回调函数,当操作系统完成耗时操作的时候,调用回调函数通知你IO结果。

异步解决的问题

  1. 在 Winform 等富客户端程序中可以让 UI 线程避免阻塞

  2. 高效处理 IO 密集型任务和 CPU 密集型任务

  3. 处理执行时间比较长的操作(比如:文件转换等)

实现异步的方式

  1. .NET 2.0用BeginInvoke、EndInvoke和回调的方式实现

  2. 将一些耗时的操作写成同步的方法,然后起一个新的线程或Task进行调用

  3. 使用 async 和 await 的异步编程模型

  4. 使用消息队列

async和await用法

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("start");
        TestAsync();
        Console.WriteLine("end");
        Console.ReadLine();
    }

    static async void TestAsync()  // 方法添加async标识符
    {
        await Task.Delay(3000);
        Console.WriteLine("***");
    }
}

输出:

start
end
***

async标识符

  1. async只是表明这个方法中可能有异步调用,并不能表示这个方法就是异步方法

  2. async是一个专门给编译器的提示,说明该函数的实现可能会出现await

  3. async唯一的用处:给await提供上下文,做向下兼容的

  4. 如果函数被标记为async,函数体内部的await才会被解释成关键字,而不会当成是一个函数,所以说当方法中有使用await关键字调用异步方法,所在的方法必须使用async

  5. async不是函数声明的一部分,仅仅是一个标识符,从调用者的角度来看,不存在async

  6. 在方法的内部使用await关键字,只要是返回Task对象的方法就可以使用await,如果没有await,那么有async标识符的方法就相当于是一个同步方法

参考

https://blog.csdn.net/young_sam/article/details/106680204

https://www.cnblogs.com/deng-jie/p/12703209.html

posted @ 2021-03-09 10:24  抓水母的派大星  阅读(76)  评论(0编辑  收藏  举报