自从C#5.0增加异步编程之后,异步编程越来越简单,async和await用的地方越来越多,越来越好用,只要用异步的地方都是一连串的异步,如果想要异步编程的时候,需要从底层开始编写,这样后边使用的时候就是异步,那么底层是如何实现??我们如何编写高效率的异步方法??

#了解基于任务的异步模式(TAP)

基于任务的异步编程模型 (TAP) 提供了异步代码的抽象化,你只需像往常一样将代码编写为一连串语句即可,在开始调用的地方运行。例如:var task = method()①; await task②; 在①的时候开始运行可能还没有运行完,在②程序挂起等待运行完,中间怎么运行的你不需要知道,编译器会做若干操作的。当开启多个任务的时候,像要他们都执行完,在执行其他的时候,可以await Task.WhenAll(task1,task2 .....);

#了解async/await

await 运算符应用于异步方法,在方法的执行中插入挂起点,直到所等待任务完成。使用async 和await定义异步方法不一定会创建新线程,当编译器看到await关键字时,线程会挂起等待运行结束。
await 仅可用于由 async 关键字修改的异步方法中,使用 async 修饰符定义的方法通常包含一个或多个 await 表达式,使用await运算符的任务通常是实现[基于任务的异步模式(TAP)]的方法调用返回,返回值包括 Task、Task<TResult>、ValueTask 和 ValueTask<TResult> 对象的方法。

# 调用 Task.Wait() 或者 Task.Result 立刻产生死锁的充分条件

1. 调用 Wait() 或 Result 的代码位于 UI 线程。
2. Task 的实际执行在其他线程,且需要返回 UI 线程。
死锁的原因:UWP、WPF、Windows Forms 程序的 UI 线程都是单线程的。为了避免产生死锁,你应该一条道走到黑, Async All the Way。或者.ConfigureAwait(false)

# ValueTask与Task的区别

7.0为async新增的ValueTask的作用(如果没有在Nuget上下载System.Threading.Tasks.Extensions,ValueTask就在这个库中),ValueTask用于值类型的异步;Task为引用类型的,每次需要分配空间。
例如:

当a,b=0的时候不会运行到task里,这个时候返回task就造成了资源的浪费,修改为以下会效率更高

但是也不是说到处用ValueTask会好,当是引用类型的时候,用ValueTask,你需要关注更多的数据,这个时候用Task会更好。

# await/async原理分析

对Start方法进行分析,可以看出MoveNext,程序的运行其实还是一步一步进行的,那么await/async会不会创建一个线程,这倒是不一定,这个由线程池决定,那么异步了不创建一个线程,怎么异步的,这里的异步可能是运行在已经有的线程上。

原文地址:https://www.cnblogs.com/zhao123/p/11078382.html

C#中await/async闲说相关推荐

  1. C# 中的Async 和 Await 的用法详解

    众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...

  2. 掌握Node.js中的Async和Await

    在本文中,你将学习如何使用Node.js中的async函数(async/await)来简化callback或Promise. 异步语言结构在其他语言中已经存在了,像c#的async/await.Kot ...

  3. 【转载】 C# 中的Async 和 Await 的用法详解

    众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...

  4. 在.NET中执行Async/Await的两种错误方法

    微信公众号:架构师高级俱乐部 关注可了解更多的编程,架构知识.问题或建议,请公众号留言; 如果你觉得此文对你有帮助,欢迎转发 在.NET中执行异步/等待的两种错误方法 在应用开发中,我们为了提高应用程 ...

  5. promise用法_JavaScript中的async/await的用法和理解

    昨天更新的是"JavaScript中的Promise使用详解",其实也就是说了下基本用法和自己对Promise的理解,可能有错误之处,也欢迎指出.今天就说一说"JavaS ...

  6. 【vue】---vue中使用async+await出现的问题及解决方案

    [vue]---vue中使用async+await出现的问题及解决方案 参考文章: (1)[vue]---vue中使用async+await出现的问题及解决方案 (2)https://www.cnbl ...

  7. 在微信小程序中使用 async/await

    微信小程序中有大量接口是异步调用,比如 wx.login() . wx.request() . wx.getUserInfo() 等,都是使用一个对象作为参数,并定义了 success() . fai ...

  8. 循环中使用async/await

    此需求在于二次循环中需要使用async/await,按照每次嵌套循环的时候,进行async,则会给出错误的输出,如下所示 let list = [{name: "a",age: 1 ...

  9. promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解

    * promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...

最新文章

  1. 微服务架构10条最佳实践
  2. python编程300集免费-python 300本电子书合集
  3. boost::detail::sp_typeinfo用法实例
  4. 初始化Spring Bean:Bean初始化有哪些方式?
  5. 解决 VS Code 保存时候自动格式化
  6. jQuery获取元素索引值index()方法
  7. C++11 range-based for loop
  8. c语言实验操作期末考试怎么把试题保存,c语言上机操作练习题_相关文章专题_写写帮文库...
  9. 微软 .NET 俱乐部在线发布会
  10. 取消ajax请求时页面闪烁,基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法...
  11. kaggle比赛:房价预测(基于MXNet框架)
  12. eps如何建立立体白模_EPS 三维测图系统(垂直摄影)快速入门手册.pdf
  13. eXtremeComponents 分页列表
  14. 阿里图标管理网站[iconfont.cn](iconfont.cn)的正确打开方式
  15. 弹球小游戏c语言编程,scratch丨(1) 弹球小游戏
  16. css3线性渐变怎么写,CSS3线性渐变指南
  17. 迭代器 iter()
  18. ransomware(假的勒索病毒)逆向分析
  19. Java仿文库的基本方法(openoffice+swftools+flexPaper)
  20. Kyligence 春季论坛成功举办,助力企业构建数字化管理新体系

热门文章

  1. yii---where or该如何使用
  2. zabbix邮件发不出去
  3. imx6 i2c分析
  4. JS partial-application
  5. delphi 7 学习步骤
  6. .NET 6 使用 Obfuscar 进行代码混淆
  7. 基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...
  8. SkyWalking配上告警更优秀
  9. Id都是“とつくとき”这样的怎么爬,在线等,急
  10. 你知道WPF与WinForms的区别吗?