用来执行异步方法的语法糖。
用async来修饰一个方法,表明这个方法是异步的,声明的async方法的返回类型必须为:void或Task或Task
被await修饰的只能是Task或者Task
在很多包里面都能看到异步的方法,方法的后缀async结尾,比如网络请求的类,EF,读取文件等。
原理如下:
把耗费时间的方法装到Task里面,执行这个Task就相当于新开了一个线程去并行执行。
用async关键之声明一个异步方法,在这个异步方法里面用await关键之 等任务Atask完成。
在主线程里面直接调用异步方法Aasync,这些异步方法开的新线程,全部并行。(我试过,并行的任务多了,无法做到几十线程并行,后面的等有空线程了去抢线程,执行)
以上async对异步任务进行了封装,其实不用async异步方法,直接调用Atask();一样的。
static void Main(string[] args)
{
DateTime s = DateTime.Now;
Aasync();
Aasync();
Aasync();
Aasync();
Aasync();
Aasync();
Aasync();
Aasync();
DateTime e = DateTime.Now;
Console.WriteLine($"花费时间{(e-s).TotalMilliseconds}毫秒");
Console.ReadKey();
}
//封装好的异步方法,微软现成的库里面就有很多async结尾的方法
async static void Aasync()
{
await Atask();
}
//这是一个特别花时间的任务,可以把他当作读取文件,网络请求,写入数据等
static Task Atask()
{
return Task.Run(()=> {
Thread.Sleep(5000);
Console.WriteLine("等了5秒");
});
}
//打印结果
//花费时间8.3136毫秒
//等了5秒
//等了5秒
//等了5秒
//等了5秒
//等了5秒
//等了5秒
//等了5秒
//等了5秒
//以上等了5秒差不多就是5秒后一起出来的