async和await介绍
async和await是 C# 的语法糖,作用:用来处理异步编程(用来简化异步编程模型)。
同步概念
概念:多个方法顺序执行,后一个会等待前一个执行完成后,才开始执行。
异步概念
概念:调用一个方法 A ,调用后会立即返回(不用等方法 A 执行完成),接着调用后面的方法 B。比如:电脑是A,喝水是B,我在电脑开机的时候可以去喝水,不用等电脑开完机再去喝。
一般我们需要异步的地方都是在进行比较耗时的操作,比如说磁盘IO、网络IO,当以同步的方式调用系统API进行磁盘读取或者获取网络数据的时候,线程会阻塞在那里等待什么事也干不了,直到操作系统从底层返回IO数据。异步模式就是在执行耗时IO API的时候线程不等待结果而是直接返回并注册一个回调函数,当操作系统完成耗时操作的时候,调用回调函数通知你IO结果。
异步解决的问题
-
在 Winform 等富客户端程序中可以让 UI 线程避免阻塞
-
高效处理 IO 密集型任务和 CPU 密集型任务
-
处理执行时间比较长的操作(比如:文件转换等)
实现异步的方式
-
.NET 2.0用BeginInvoke、EndInvoke和回调的方式实现
-
将一些耗时的操作写成同步的方法,然后起一个新的线程或Task进行调用
-
使用 async 和 await 的异步编程模型
-
使用消息队列
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标识符
-
async只是表明这个方法中可能有异步调用,并不能表示这个方法就是异步方法
-
async是一个专门给编译器的提示,说明该函数的实现可能会出现await
-
async唯一的用处:给await提供上下文,做向下兼容的
-
如果函数被标记为async,函数体内部的await才会被解释成关键字,而不会当成是一个函数,所以说当方法中有使用await关键字调用异步方法,所在的方法必须使用async
-
async不是函数声明的一部分,仅仅是一个标识符,从调用者的角度来看,不存在async
-
在方法的内部使用await关键字,只要是返回Task对象的方法就可以使用await,如果没有await,那么有async标识符的方法就相当于是一个同步方法