zoukankan      html  css  js  c++  java
  • async和await用法

     

    async和await用法

    要理解async和await的用法,首先要了解Task相关知识,这里不做说明,因为这不是本文的重点。

    如果你已经对Task很了解,那么如何使用async和await,在此主要总结了以下三点:

    1. 只有在async方法里面才能使用await操作符;
    2. await操作符是针对Task对象的;
    3. 当方法A调用方法B,方法B方法体内又通过await调用方法C时,如果方法C内部有异步操作,则方法B会等待异步操作执行完,才往下执行;但方法A可以继续往下执行,不用再等待B方法执行完。

    对于第三点说的有点绕,所以下面结合代码说一下:

    复制代码
            static void Main(string[] args)
            {
                Test();
                Console.WriteLine("Test End!");
                Console.ReadLine();
            }
    
            static async void Test()
            {
                await Test1();
                Console.WriteLine("Test1 End!");
            }
    
    
            static Task Test1()
            {
                Thread.Sleep(1000);
                Console.WriteLine("create task in test1");
    
                return Task.Run(() =>
                {
                    Thread.Sleep(3000);
                    Console.WriteLine("Test1");
                });
            }
    复制代码

    执行结果:

    对结果解释是:

      Main方法调用具有async标示的Test方法,Test方法通过await调用Test1方法,当执行顺序执行到Test1时,遇到里面的异步操作;则Test方法会等待Test1里面的异步操作执行完再往下执行;但是Main方法,不用再等待Test方法执行,可以继续往下执行。


    对于上面情况,可以不使用async和await也能实现,代码如下:

    复制代码
            static void Main(string[] args)
            {
                Test();
                Console.WriteLine("Test End!");
                Console.ReadLine();
            }
    
            static void Test()
            {
                var test1=Test1();
    
                Task.Run(() =>
                {
                    test1.Wait();
                    Console.WriteLine("Test1 End!");
                });
            }
    
            static Task Test1()
            {
                Thread.Sleep(1000);
    
                Console.WriteLine("create task in test1");
    
                return Task.Run(() =>
                {
                    Thread.Sleep(3000);
                    Console.WriteLine("Test1");
                });
            }
    复制代码

    最后:这是我个人的理解和总结,欢迎大家来讨论或指教

     

     

     

     

     

     
    标签: TPL

     

     

     

     

  • 相关阅读:
    Supervisord管理进程实践
    centos7优化启动项,关闭一些不必要开启的服务
    centos彻底删除文件夹、文件命令(centos 新建、删除、移动、复制等命令)讲解
    CentOS 7 vi编辑命令
    C# 23种设计模式汇总
    设计模式——速记口诀
    CentOS 7.x设置自定义开机启动,添加自定义系统服务
    T-SQL 之 事务
    T-SQL 之 触发器
    T-SQL 之 表变量和临时表
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3575506.html
Copyright © 2011-2022 走看看