第一章:Nuget与异步编程(二)——什么是异步编程
一、 为什么要使用异步编程
本质:IO跟不上CPU,拖慢程序运行进程
关键字:async await
上面两个关键字只是编译器功能,编译器会使用Task类创建代码。若不使用这两个关键字,则使用Task类也可以完成相关功能
注:异步不等于多线程
二、async、await的基本使用
- 异步方法
- 什么是异步方法:通常是借助于线程或任务,在后台运行的方法,并不会阻塞调用线程。通俗来说就是异步方法借助这两个关键字格外开了一个线程去执行方法体内的代码。
- 异步方法的返回值一般是Task<T>,T是真正的返回值类型,若返回值为void,则将Task<T>换为Task,即使是Main()方法也要返回Task;
- 命名惯例:以Async结尾。如getMethodAsync();
- 调用泛型方法时,一般在方法前面添加await关键字。这样拿到的返回值就是由泛型指定的T类型
- 异步方法的“传染性”:一个方法中若有await调用,则这个方法必须修饰为async。
- async、await关键字:
- async用于修饰异步方法。即,被async修饰的方法是异步方法,支持异步调用。但是,这个方法也可以同步调用,至于是异步调用还是同步调用,则由关键字await控制
- await关键字可以用来调用异步方法,若不使用await关键字,则默认被调用的方法是同步方法。若被调用方法是异步方法,则在同步调用时主线程不会等待子线程
用异步的原因:承受更大的并发量
如,我们删去await关键字,构建一个较大的字符串,然后直接向这个文件中写入字符串而不使用await,结果如下:
报错信息为“该进程无法访问文件‘D:\code\test.txt’因为它被另一个进程占用”。其实所谓的“另一个进程”就是该程序本身。File.WriteAllTextAsync()方法默认独占式写入,但是这里还没有写入完成,程序的子线程还在占用该文件进行写操作。此时程序就继续向下执行(非异步,即子线程还在占用文件写入,但主线程不等待子线程),导致资源挤占而报错
修正:添加await,这样主线程就会等待写入子线程执行完毕后在执行,不再报错: