返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#中async和await的深入分析
  • 620
分享到

C#中async和await的深入分析

c# async和awaitc#异步编程 2022-11-13 19:11:19 620人浏览 薄情痞子
摘要

目录大概理解深入分析await和Wait()的区别去掉Task.Run的Wait小结其他.Await();总结大概理解 查了一个小时的资料:async和await 发现这个大神的解释

大概理解

查了一个小时的资料:async和await

发现这个大神的解释一针见血,深得我心!以最简单的例子,解释了async和await。妙~~~

大多情况下,分开才能体现async和await的价值!

 但,await 并没有这么简单。

深入分析

await和Wait()的区别

接下来继续往下看:

await Task.Delay(3000);  和Task.Delay(3000).Wait();   有没有区别?

上代码:

using System.Diagnostics;
 
namespace await_async2
{
    internal class Program
    {
 
        static  public void TestWait()
        {
            var t = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Start");
                Task.Delay(3000).Wait();
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }
 
 
        static public void TestWait2()
        {
            var t = Task.Factory.StartNew(async () =>
            {
                Console.WriteLine("Start");
                await Task.Delay(3000);
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }
 
        static public void TestWait3()
        {
            var t = Task.Run(async () =>
            {
                Console.WriteLine("Start");
                await Task.Delay(3000);
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }
 
        static void Main(string[] args)
        {
            TestWait2();
            //避免程序提前退出,导致一些现象看不到
            Task.Delay(5000).Wait();
        }
    }
}

首先,强调一下,最后一句 Task.Delay(5000).Wait(); 是必须的,不然,程序提前退出,导致一些现象看不到,从而蒙蔽了我们。

第1段代码TestWait执行效果,如下:

第2段代码TestWait2执行效果,如下:

第3段代码TestWait3执行效果,如下:

现在给出结论:

Task.Delay(3000).Wait(); 这个就是同步等。

await Task.Delay(3000); 因为没有分开来写(见第一张图),所以基本和同步等没有区别。

但是如果 await Task.Delay(3000); 是写到:Task.Factory.StartNew里面的

static public void TestWait2()
        {
            var t = Task.Factory.StartNew(async () =>
            {
                Console.WriteLine("Start");
                await Task.Delay(3000);
                Console.WriteLine("Done");
            });
            t.Wait();
            Console.WriteLine("All done");
        }

那这个效果不一样了,他们执行的权限丢出去了有点像python里的yeild,来看下程序的执行顺序:

 这里就看出了:await Task.Delay(3000);  和Task.Delay(3000).Wait(); 的区别了。(但是这种情况如果在道Task.Run里面就体现不出来!)

然后,我有简单做了一个实验:

这就更明了了, await Task.Delay(3000); 就像设置了一个回调,一旦三秒时间一到,程序的指针就会回到await Task.Delay(3000);后面的位置,直到函数执行结束。再回到之前的位置。这就是所谓的用同步的方式写异步的代码吧

但是,为啥在Task.Factory.StartNew才会体现出来,这个我就不清楚了,请各位大佬指点一下。

去掉Task.Run的Wait

再来对比一下,下面这两个函数:

 static public void TestWait8()
 {
     var t = Task.Run(async () =>
     {
         Console.WriteLine("Start");
         await Task.Delay(3000);
         Console.WriteLine("Done");
     });
     Console.WriteLine("All done");
 }
 static public void TestWait8_5()
 {
     var t = Task.Factory.StartNew(async () =>
     {
         Console.WriteLine("Start");
         await Task.Delay(3000);
         Console.WriteLine("Done");
     });
     t.Wait();
     Console.WriteLine("All done");
 }

先看第一个TestWait8,由于Task.Run不再调用 t.Wait(),Task.Run内部这个线程主线程是并行的关系。程序指针会在两个线程中来回切换。如果一方中写了await xxx,那程序指针必然跳到另一个线程。直达await结束才可能返回。 这种情形是比较多的。此时await能节省大量等待时间(比如io操作时间),充分利用等待时间。

此时 Console.WriteLine("All done");会最先被打印出来。

再看第二个TestWait8_5(其实就是回顾一下),当程序执行到t.Wait()时,程序不会继续向下了,(此时因为有t.Wait()的存在,所以子线程其实是优先于主线程的)而是进入到子线程的内部进程,试图将这个线程执行完,但是再线程里面遇到又遇到await Task.Delay(3000);此时程序指针不会再这里死等,程序指针又跳回主线程继续执行,直到三秒到了之后就会回到子线程,子线程执行完了之后,再回到主线程。

但是如果吧TestWait8_5 中    Task.Factory.StartNew 换成 Task.Run ,那么前面的过程一样,只是执行到await Task.Delay(3000);时候,此时会死等,不会跳到主线程,而是一定等到这个子线程完结,再回主线程。

小结

总结一下就是,遇到await 一定会等,至于程序指针是先跳到其他线程,还是在此线程死等,就看你的线程函数这么写的了。

其他

.Await();

最后,还有个:Task.Delay(3000).Await();

这个是prsim对Task写的的一个拓展方法(避免在主线程调用时,阻塞UI):

总结

到此这篇关于C#中async和await的文章就介绍到这了,更多相关C# async和await内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#中async和await的深入分析

本文链接: https://lsjlt.com/news/171094.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#中async和await的深入分析
    目录大概理解深入分析await和Wait()的区别去掉Task.Run的Wait小结其他.Await();总结大概理解 查了一个小时的资料:async和await 发现这个大神的解释...
    99+
    2022-11-13
    c# async和await c#异步编程
  • async和await实例分析
    本文小编为大家详细介绍“async和await实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“async和await实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。创建static voi...
    99+
    2023-06-17
  • Js中async/await的示例分析
    这篇文章将为大家详细讲解有关Js中async/await的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。async/await 是一种编写异步代码的新方法。之前异...
    99+
    2024-04-02
  • 深入浅出探究JavaScript中的async与await
    目录1、前言2、详解2.1、async2.1.1、函数返回非Promise对象2.1.2、函数返回Promise对象2.2、await2.3、async、await结合使用2.4、a...
    99+
    2024-04-02
  • C#中async和await有什么用
    这篇文章将为大家详细讲解有关C#中async和await有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言本文介绍async/Task。在学习该知识点过程中,一定要按照每一个示例,去写代码、执行、...
    99+
    2023-06-20
  • C#异步编程由浅入深(二)之Async/Await的使用
      考虑到直接讲实现一个类Task库思维有点跳跃,所以本节主要讲解Async/Await的本质作用(解决了什么问题),以及Async/Await的工作原理。实现一...
    99+
    2024-04-02
  • 一篇文章弄懂C#中的async和await
    目录前言 async await 从以往知识推导 创建异步任务 创建异步任务并返回Task 异步改同步 说说 await Task 说说 async Task<TResult&...
    99+
    2024-04-02
  • ES6中Promise、async和await面试题实例代码分析
    这篇“ES6中Promise、async和await面试题实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ES6中...
    99+
    2023-07-05
  • 关于对async await效率问题的深入思考
    关于async await async await于ES2017标准引入,本身的功能是作为语法糖简化写法的。 下面列举一个使用promise的例子: function myProm...
    99+
    2024-04-02
  • C#5.0中的异步编程关键字async和await
    一、Asynchronous methods 异步方法 .NET 4.5 的推出,对于C#又有了新特性的增加——就是C#5.0中async和await两个关键...
    99+
    2024-04-02
  • JS中的async与await异步编程及await使用陷阱源码分析
    这篇“JS中的async与await异步编程及await使用陷阱源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS中...
    99+
    2023-07-05
  • JavaScript中async,await的使用和方法
    JS中 async函数和await 关键字 function hellworld() { return "您好!美好世界!"; } console.log...
    99+
    2024-04-02
  • 如何理解C# 5.0的新特性Async和Await
    今天就跟大家聊聊有关如何理解C# 5.0的新特性Async和Await,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、引言在之前的C#基础知识系列文章中只介绍了从C#1.0到C#4...
    99+
    2023-06-17
  • 关于C#中async/await的用法实例详解
    一直对c#中async/await的用法模模糊糊,不太清晰,今天写了一下Demo彻底明确一下async/await的用法,以免因为对其不了解而对后期的业务产生影响(比如事务导致的锁表...
    99+
    2023-02-08
    C#中async/await的用法 C#中async/await
  • Javascript中promise,async和await的区别是什么
    本文小编为大家详细介绍“Javascript中promise,async和await的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Javascript中promise,async和await的区别是什么”文章能帮助大家解决疑惑...
    99+
    2023-06-29
  • koa2中使用async 、await、promise解决异步问题的示例分析
    这篇文章给大家分享的是有关koa2中使用async 、await、promise解决异步问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。关键词:async 、awai...
    99+
    2024-04-02
  • JavaScript中async和await的使用及队列详情
    目录一、宏任务和微任务的队列入门知识,可以参考之前的文章:1.async && await概念2.async && await基本使用二、async&...
    99+
    2024-04-02
  • node基于async/await对mysql进行封装的示例分析
    小编给大家分享一下node基于async/await对mysql进行封装的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!...
    99+
    2024-04-02
  • C#中使用async和await实现异步Udp通讯的示例代码
    目录C/S架构客户端实现客户端主流程和实现客户端发送消息实现客户端监听消息实现服务器实现服务器主流程和实现服务器发送消息实现服务器监听消息实现总结在之前的C#版本中, 如果我们想要进...
    99+
    2024-04-02
  • 深入探讨JavaScript中的async函数
    说白了:await就相当于 then 方法的第一个回调函数,只返回成功的值,失败的值需要 try...catch来捕获。async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调...
    99+
    2022-11-22
    async await javascript
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作