c# await 到底等待的是什么?

本文通过一个具体的C#异步编程示例,详细解析了async/await关键字的工作原理及Task的执行流程,帮助读者理解如何正确使用这些特性来编写高效并发的应用程序。
static void Main(string[] args)
        {
            Print();
            Console.WriteLine("5 :::" + Thread.CurrentThread.ManagedThreadId);
            Console.ReadKey();
        }

        public static async void Print()
        {
            Console.WriteLine("1 :::" + Thread.CurrentThread.ManagedThreadId);
            await PrintAsync();//主线程走到这里的时候并没有返回.所谓返回,是指从当前 async 方法内部返回到调用该方法的位置继续往下执行
            Console.WriteLine("8 :::" + Thread.CurrentThread.ManagedThreadId);//由于 PrintAsync() 方法返回的是 tk2,所以这里要等 tk2 执行完毕才会执行.
        }

        public static Task PrintAsync()
        {
            Thread.Sleep(2000);
            Console.WriteLine("2 :::" + Thread.CurrentThread.ManagedThreadId);
            Task tk1 = Task.Run(() =>
            {
                Thread.Sleep(2000);
                Console.WriteLine("6 :::" + Thread.CurrentThread.ManagedThreadId);
            });
            Console.WriteLine("3 :::" + Thread.CurrentThread.ManagedThreadId);
            Task tk2 = Task.Run(() =>
            {
                Thread.Sleep(5000);
                Console.WriteLine("7 :::" + Thread.CurrentThread.ManagedThreadId);
            });
            Console.WriteLine("4 :::" + Thread.CurrentThread.ManagedThreadId);//主线程走到这里才返回.当然,tk1,tk2 已经开始执行了.
            return tk2;
        }

 

直接上结果 

 

之前一直理解的是,await 等待的是后面紧跟着的方法,实际等待的是  这个方法返回的 Task 执行完毕,而这个方法里面的非 task 代码依然是同步执行.

 

转载于:https://www.cnblogs.com/refuge/p/8395349.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值