.Net Task的用法(二)async和await

C#异步编程详解
本文深入探讨C#中的异步编程,通过具体代码示例解释了如何使用async和await关键字来实现非阻塞操作。文章详细展示了主线程与新线程间的任务调度流程,以及Task如何在异步方法间传递。

先上一段代码

static void Main(string[] args)
{
    Console.WriteLine("1");

    var task = Test();

    Console.WriteLine("4");
    Thread.Sleep(1000);

    Console.WriteLine("5");

    task.Wait();
    Console.WriteLine("7");
    Console.ReadKey();
}

static async Task Test()
{
    //主线程
    Console.WriteLine("2");
    //主线程
    await GetName();

    Console.WriteLine("6");
}

static async Task GetName()
{
    Console.WriteLine("3");

    ///开新线程
    await Task.Run(() =>
    {
        Thread.Sleep(1000 * 5);
        Console.WriteLine("5 new");
    });

}
  1. 主线程中打印1,调用方法Test() 返回一个Task
  2. 主线程执行Test中方法 打印2,通过await 关键字等待GetName()方法执行完成
  3. 主线程执行GetName中的方法 打印3,之后主线程开启新的线程执行业务逻辑
  4. Main 方法中休眠1秒后打印4(因为打印4 之前并没有要求task 变量的 返回值或者等待,所有打印4的操作和新线程中的业务处理是同步的)
  5. 新线程中业务处理完成,Test中的await 通过,所有打印5
  6. 由于打印6之前要求了task 变量等待,所以当Test 执行完成后打印6

简单的理解就是 await 就是等待async 方法执行完成,async方法里面总能找到新开的线程

await并不是针对于async的方法,而是针对async方法所返回给我们的Task,这也是为什么所有的async方法都必须返回给我们Task。所以我们同样可以在Task前面也加上await关键字,这样做实际上是告诉编译器我需要等这个Task的返回值或者等这个Task执行完毕之后才能继续往下走。

转载于:https://www.cnblogs.com/PenZ/p/10318191.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值