【C#】async/await 笔记

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):进入Main");
            string name = Getinfo().Result; //用到了Getinfo()的结果,所以这里会等待它执行完毕后 才执行后续代码
            Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):回到Main了");
            Console.ReadLine();
        }

        private async static Task<string> Getinfo()
        {
            Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):进入Getinfo");
            await GetName();
            Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):我在GetName后面");//用await的线程执行

            GetGender();//直接调用,没有用到Getinfo的结果,也没有await关键字,所以不会等待它的结果返回,直接执行后续代码
            Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):我在GetGender后面"); 
            return "hello";
        }

        private static async Task<string> GetName()
        {
            return await Task.Run(() =>
            {
                Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):进入GetName");
                Thread.Sleep(3000);
                Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):GetName休眠3秒后");
                return "lisi";
            });
        }

        private static async void GetGender()
        {
            await Task.Run(() =>
            {
                Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString()+ "):进入GetGender");
                Thread.Sleep(3000);
                Console.WriteLine(DateTime.Now + "(线程号:" + Thread.CurrentThread.ManagedThreadId.ToString() + "):GetGender休眠3秒后");
            });
        }
    }
}

运行结果:
在这里插入图片描述

结论:

  1. await 关键字表明了会等待任务执行完成 才继续执行后续代码
    在这里插入图片描述
    没有await 关键字时,就不会等待,直接执行后续代码:在这里插入图片描述

  2. 将耗时的任务用异步来完成,开辟新线程来执行,不阻塞当前线程
    在这里插入图片描述

  3. await后的代码会用await任务开辟的线程继续执行。
    在这里插入图片描述

  4. 如果用到了异步方法的结果,就算没有await关键字也会等待它的结果返回才会执行后续代码。如果没有用到到异步方法的结果,也没有加await关键字,则不会等待任务完成就继续执行后续代码。
    在这里插入图片描述

/************************************************* 分割线 ***********************************************************/

修改一下代码:
在这里插入图片描述
结论:
调用异步方法时,遇到异步方法里的await关键字才会返回;遇到await之前,主线程依然被阻塞。

延伸:
小程序的api,也是异步的。虽然方法里有很多await,但只是阻塞了方法内部的代码执行,并没有阻塞主线程,所以小程序调用api后,会很快就返回小程序端,小程序端就能继续执行后续代码,等到api执行完成再将结果返回给小程序,小程序感应到结果返回再做相应处理。
如果api是同步的,或者await关键字在处理了时间较长的逻辑后才出现,小程序UI反应就会变慢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值