用来执行异步方法的语法糖。

    用async来修饰一个方法,表明这个方法是异步的,声明的async方法的返回类型必须为:void或Task或Task。方法内部必须含有await修饰的方法,如果方法内部没有await关键字修饰的表达式,哪怕函数被async修饰也只能算作同步方法,执行的时候也是同步执行的。


    被await修饰的只能是Task或者Task类型,通常情况下是一个返回类型是Task/Task的方法,当然也可以修饰一个Task/Task变量,await只能出现在已经用async关键字修饰的异步方法中。

    在很多包里面都能看到异步的方法,方法的后缀async结尾,比如网络请求的类,EF,读取文件等。
    原理如下:
    把耗费时间的方法装到Task里面,执行这个Task就相当于新开了一个线程去并行执行。
    用async关键之声明一个异步方法,在这个异步方法里面用await关键之 等任务Atask完成。
    在主线程里面直接调用异步方法Aasync,这些异步方法开的新线程,全部并行。(我试过,并行的任务多了,无法做到几十线程并行,后面的等有空线程了去抢线程,执行)

    以上async对异步任务进行了封装,其实不用async异步方法,直接调用Atask();一样的。

    1. static void Main(string[] args)
    2. {
    3. DateTime s = DateTime.Now;
    4. Aasync();
    5. Aasync();
    6. Aasync();
    7. Aasync();
    8. Aasync();
    9. Aasync();
    10. Aasync();
    11. Aasync();
    12. DateTime e = DateTime.Now;
    13. Console.WriteLine($"花费时间{(e-s).TotalMilliseconds}毫秒");
    14. Console.ReadKey();
    15. }
    16. //封装好的异步方法,微软现成的库里面就有很多async结尾的方法
    17. async static void Aasync()
    18. {
    19. await Atask();
    20. }
    21. //这是一个特别花时间的任务,可以把他当作读取文件,网络请求,写入数据等
    22. static Task Atask()
    23. {
    24. return Task.Run(()=> {
    25. Thread.Sleep(5000);
    26. Console.WriteLine("等了5秒");
    27. });
    28. }
    29. //打印结果
    30. //花费时间8.3136毫秒
    31. //等了5秒
    32. //等了5秒
    33. //等了5秒
    34. //等了5秒
    35. //等了5秒
    36. //等了5秒
    37. //等了5秒
    38. //等了5秒
    39. //以上等了5秒差不多就是5秒后一起出来的