首页 > 其他分享 >初步学习async/await,Task.GetAwaiter,Task.Result

初步学习async/await,Task.GetAwaiter,Task.Result

时间:2024-09-25 12:47:07浏览次数:9  
标签:Task Console await static Result WriteLine Test

初步学习async/await,Task.GetAwaiter,Task.Result

 

   网上关于async/await的知识有很多,看了很多但不如自己实践一遍来得快,所以这里记录下我的理解和大家学习下。

   首先以最简单的同步方法来开始如下

复制代码
 private static   void Test()
        {

            Console.WriteLine(2);
            GetV();
            Console.WriteLine(6);
        }
        private static  void GetV()
        {
            Console.WriteLine(3);
           Console.WriteLine(4);
            Console.WriteLine(5);
        }

        static void Main(string[] args)
        {

            Console.WriteLine(1);
           Test();
            Console.WriteLine(7);
       } 
复制代码

输出如下

 

 

 当时当我们简单的使用Task.Run时

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 private static   void Test()       {             Console.WriteLine(2);           GetV();           Console.WriteLine(6);       }       private static  void GetV()       {           Console.WriteLine(3);           Task.Run(() =>           {               Thread.Sleep(10000);               Console.WriteLine(4);           });           Console.WriteLine(5);       }         static void Main(string[] args)       {             Console.WriteLine(1);          Test();           Console.WriteLine(7);        }

  

,因为分配了新的线程,所以4会最晚打印出来。

 

 这时候我们使用async/await呢?

复制代码
 private static async Task Test()
        {

            Console.WriteLine(2);
            await  GetV();
            Console.WriteLine(6);
        }
        private static async Task GetV()
        {
            Console.WriteLine(3);
            await Task.Run(() =>
            {
                Thread.Sleep(10000);
                Console.WriteLine(4);
            });
            Console.WriteLine(5);
            
        }

        static void Main(string[] args)
        {

            Console.WriteLine(1);
            var v= Test();
            Console.WriteLine(7);
       }
复制代码

 

因为await会时被修饰的代码处于等待状态,就相当于阻塞那段代码,Test方法里面执行到await时就会等待Getv的方法的执行,就会阻塞Test方法,但是不会阻塞Main方法,可以理解为await将阻塞的控制权交给了Test方法。所以这个时候打印结果为

 

 但是当我们把Test的await去掉了,这时候Test方法就没有了阻塞的权限,而是去寻找下一个await来转移控制权,如下

复制代码
   private static void Test()
        {

            Console.Out.WriteLine(2);
            GetV();
            Console.Out.WriteLine(6);
        }
        private static async Task GetV()
        {
            Console.Out.WriteLine(3);
            await Task.Run(() =>
            {
                Thread.Sleep(10000);
                Console.WriteLine(4);
            });
            Console.Out.WriteLine(5);
            
        }

        static void Main(string[] args)
        {

            Console.Out.WriteLine(1);
            Test();
            Console.Out.WriteLine(7);
            string str = Console.ReadLine();
       }
复制代码

这个时候就不会阻塞Test方法,结果如下

 

如果在main方法里面使用Task.GetAwaiter或者Task.Result呢,这两个东西我的理解就是阻塞线程,等待异步返回结果,但是它阻塞的是当前的方法,如下代码

复制代码
        private static async Task Test()
        {

            Console.Out.WriteLine(2);
            GetV();
            Console.Out.WriteLine(6);
        }
        private static async Task GetV()
        {
            Console.Out.WriteLine(3);
            await Task.Run(() =>
            {
                Thread.Sleep(10000);
                Console.WriteLine(4);
            });
            Console.Out.WriteLine(5);
            
        }

        static void Main(string[] args)
        {

            Console.Out.WriteLine(1);
            Test().GetAwaiter().GetResult() ;
            Console.Out.WriteLine(7);
            string str = Console.ReadLine();
         }
复制代码

它只会阻塞main方法的,但是对于Test方法它是无法阻塞的,Test方法仍然会异步执行,4,5仍然以异步的方法打印出来,所以打印结果如下

 

 Task.Result也是如此,只会阻塞当前的方法,我觉得和await相似,只给了当前使用Task.GetAwaiter或者Task.Result的方法阻塞全,没有权利阻塞别的方法。

 

 

 

 

 

 

打个广告:游戏也能赚钱?如果你热爱游戏,并且想通过游戏赢得零花钱,5173是个不错的选择  

标签:Task,Console,await,static,Result,WriteLine,Test
From: https://www.cnblogs.com/sexintercourse/p/18431104

相关文章

  • Docker-compose 启动 mysql 报错 ERROR: for mysql Cannot start service mysql: fai
    报错详情root@hadoop107cmp]#docker-composeconfig-q[root@hadoop107cmp]#ll总用量70192-rw-r--r--.1rootroot718650749月2406:45docker-boot-0.0.1-SNAPSHOT.jar-rw-r--r--.1rootroot10149月2408:26docker-compose.yml-rw-r--r--.1rootro......
  • hive报错Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.Ma
    问题:查看hive日志进入日志文件下查看hiveserver2.log我的hive日志在如下文件夹下:cd/var/log/my_hive_log如果日志中显示如下错误:Maximumwassetto100partitionspernode,numberofdynamicpartitionsonthisnode:101这个错误信息表明在某个节点上动态生成......
  • 万象更新 Html5 - es6 进阶: async/await
    源码https://github.com/webabcd/Html5作者webabcd万象更新Html5-es6进阶:async/await示例如下:es6\src\advanced\async_await.js/***async/await-用于异步编程(非多线程)*asyncfunction返回的是Promise对象*await用于等Promise对象或者thenab......
  • async await执行顺序
    asyncawait执行顺序async/await 是用于编写异步代码的语法糖,它允许你以类似于同步代码的方式写异步操作。async 关键字声明的函数会返回一个Promise,而 await 关键字用于等待一个Promise完成。执行顺序如下:调用 async 函数。函数会继续执行,遇到 await 时,控制......
  • WPF window fill the full screen and overlap on the taskbar
    WindowState="Maximized"WindowStyle="None"   <Windowx:Class="WpfApp409.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsof......
  • Tasker配合ntfy接收通知
    ntfy是一个在设备间传递消息的工具。可以直接使用官方提供的服务,也可以自建。类似的工具还有很多,例如gotify等等。这里以ntfy为例,其他工具也大多支持GET或PUT的方式发送和接收消息。Tasker是一个在安卓设备上非常流行的自动化工具,可以发送GET请求与ntfy服务器通讯来接收消息。nt......
  • freeRTOS源码解析4--tasks.c 5
    4.2.13继续任务--vTaskResume接口:voidvTaskResume(TaskHandle_txTaskToResume)形参1:xTaskToResume,想要继续的任务handle;首先是vTaskResume调用的一个内部函数:staticBaseType_tprvTaskIsTaskSuspended(constTaskHandle_txTask),用于检查任务是否是挂起状态,只有挂起的......
  • Datawhale Leecode基础算法篇 task02:递归算法and分治算法
    官方学习文档:datawhalechina往期task01:枚举算法链接:DatawhaleLeecode基础算法篇task01:枚举算法递归算法递归简介递归(Recursion):指的是一种通过重复将原问题分解为同类的子问题而解决的方法。在绝大数编程语言中,可以通过在函数中再次调用函数自身的方式来实现递归。举......
  • Basics of using bash, and shell tools for covering several of the most common ta
    Basicsofusingbash,andshelltoolsforcoveringseveralofthemostcommontasksIntroduction‍Mostshellshavetheirownscriptinglanguagewithvariables,controlflowanditsownsyntax.‍Shellscriptingoptimizedforperformingshell-relatedta......
  • Basics of using bash, and shell tools for covering several of the most common ta
    Basicsofusingbash,andshelltoolsforcoveringseveralofthemostcommontasksIntroduction‍Mostshellshavetheirownscriptinglanguagewithvariables,controlflowanditsownsyntax.‍Shellscriptingoptimizedforperformingshell-relatedta......